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
hibernate的Criteria还存在某些问题而且久未更新功能,特别是属性只能使用字符串,而不能用类似JPA的Metamodel,按照官方建议最好还是使用JPA的Criteria。
另外QueryDSL也是不错的选择,但是略显臃肿。