Hibernate criteria 关联

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也是不错的选择,但是略显臃肿。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值