Hibernate criteria 关联

来源:互联网 发布:网络剧的受众分析 编辑:程序博客网 时间:2024/06/05 15:33

hibernate的criteria版本相对比较老了,好像好久没更新新内容了,在hibernate5.2以后的源码中直接被Deprecated掉了,然后建议使用Jpa的criteria。

hibernate的关联比较的奇葩,大概的实现方式如下:

List<User> users = session.createCriteria(User.class)                .createAlias("role", "role", JoinType.LEFT_OUTER_JOIN)                .add(Property.forName("role.roleName").eq("su")).list();

还有种方式是createCriteria来关联对象:

List<User> users = session.createCriteria(User.class)                .createCriteria("role", "role", JoinType.LEFT_OUTER_JOIN)                .add(Property.forName("roleName").eq("su")).list();

两者调用非常类似,唯一区别就是createAlias返回当前的Criteria,createCriteria返回一个新的criteria,而新的criteria的操作主体类就变成了Role.class了,所以后续的拼接条件时createAlias需要使用"role.roleName",而createCriteria是直接使用"roleName",而且原来User里面的属性就不能再引用了。


其中最奇葩的地方是貌似只能以fetch的方式关联,而不能以join的方式关联!!!

转换成hql的方式也就是:

只能实现

from User user left out join fetch user.role role where role.roleName=:roleName
而不能实现

from User user left out join user.role role where role.roleName=:roleName


翻遍了Criteria所有的API也没能找到可以实现的方法。另外发现一个API:setFetchMode,这个是用来设置是否热抓取,设置了FetchMode.JOIN后将会热抓取,但是却又不能设置JoinType,只能以left out join的模式关联,略蛋疼。


hibernate的Criteria还存在某些问题而且久未更新功能,特别是属性只能使用字符串,而不能用类似JPA的Metamodel,按照官方建议最好还是使用JPA的Criteria。

另外QueryDSL也是不错的选择,但是略显臃肿。





0 0
原创粉丝点击