我在Hibernate中的功能有问题。考虑这两个类:
public class Project
{
...
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="user")
private User user;
...
}
public class User
{
...
private Integer id;
private String name;
...
}
现在我尝试获取分配给项目的所有用户的列表。但是这个查询是无用的慢(超过100'000个项目条目,很多连接):
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是一个Object(但这可以作为本机SQL查询):
SELECT id, name FROM User WHERE id IN(SELECT user FROM Project GROUP BY user)
还有其他想法吗?提前谢谢!
答案 0 :(得分:1)
我怀疑这与Hibernate的速度有关。如果直接在数据库上运行,SQL查询很可能很慢。
一个好的做法是在表中有外键时创建索引。在您的情况下,在user_id
表上为project
创建索引并再次运行查询。
答案 1 :(得分:1)
尝试从外键列创建 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")
希望这有帮助。
答案 2 :(得分:0)
如果您希望将所有用户分配到项目,则不需要group by
。做这样的事情
select user from Project project inner join project.user user where project.id = :projectId