我在Hibernate中的group by特性有性能问题。考虑这两类:

public class Project
{
...
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="user")
    private User user;
...
}

public class User
{
...
    private Integer id;
    private String name;
...
}

现在我尝试获取分配给项目的所有用户的列表。但是这个查询速度非常慢(超过10万个项目条目,很多连接):
Session session = this.sessionFactory.openSession();
String SQL="SELECT user.id as id, user.name as name FROM Project p GROUP BY p.user.id";
Query q = session.createQuery(SQL);
q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List<Object> list = q.list();
session.close();

我试图以这种方式更改查询,但这也不起作用,因为变量user是一个对象(但这将作为本机SQL查询工作):
SELECT id, name FROM User WHERE id IN(SELECT user FROM Project GROUP BY user)

还有其他想法吗?提前谢谢你!

最佳答案

尝试从外键列创建index

@javax.persistence.Table(name = "project")
@Table(appliesTo = "project" ,indexes = @Index(columnNames = "user", name = "user_index"))
@Entity
public class Project
{
 ..

更新
columnNames已被清除。改为使用columnList
@Index(columnList = "user", name = "user_index")

希望这有帮助。

10-05 22:12