hibernate in

一个学科表(Field),一个用户表(User),多对多关系。

学科表有两个字段,id和descripiton,用户表有众多字段,不罗列了

Field中有SET集合users

User中有SET集合fields

现在要查掌握idlike'520%'的女性用户

我这样写的:

fromUseru,Fieldfwhereu.gender='m'in(selectf.usersfromFieldwheref.idlike'520%')

持续报错!

我的项目代码中恰好有一个多对多的关联映射的类:User(用户)和Role(角色),其中,User类中有roles集合,而Role类中有users集合。我用我的代码测试了一番。

首先写了下面这句:

selectuserfromUseruserwhereuser.sex='男'anduserin(selectrole.usersfromRolerolewhererole.id>5)

这样不行,报错。原因是,Hibernate的HQL语句中的“in条件”句如:x in(‘a’,’b’,’c’),要求的是x是(‘a’,’b’,’c’)中的一个元素,而selectrole.users这样查出来的是集合的集合,它内部的元素应该是一个集合:set<user>in(selectrole.users…),而不是一个对象:userin(selectrole.users…)。

可惜的是HQL语句没有set<user>in(selectrole.users….)这样的子句,后来,查了一下Hibernate的参考文档,得到解决方法。原来,Hibernate的HQL语句中的“in条件”中,可加入”elements”关键词,即上面的查询语句变成:

selectuserfromUseruser,Rolerolewhereuser.sex='男'anduserinelements(role.users)androle.id>5

这样就行了。

不过还有一个小问题,就是这样查询出来,会出现许多重复记录,原因是查询出的每一个符合的role后,会通过role.getUsers()查出users集合,这样,当然就可能出现有几个role拥有相同的user的现象。很容易解决,加多一个“distinct”关键词就行。

selectdistinct userfromUseruser,Rolerolewhereuser.sex='男'anduserinelements(role.users)androle.id>5

好了,解决了。那位CSDN中的朋友提的问题也解决了,它的hql语句如下:

selectdistinctufromUseru,Fieldfwhereu.gender='m'anduinelements(f.users)andf.idlike'520%'

相关推荐