Hibernate:组很慢

时间:2015-12-15 08:19:42

标签: java mysql hibernate

我在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)

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

3 个答案:

答案 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