我在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")
希望这有帮助。