使用AND,OR运算符的Hibernate Criteria查询

时间:2013-05-07 09:22:02

标签: java hibernate hibernate-criteria

在我的应用程序中,我有两个实体类UserActivity

活动类是:

 public class Activity{
 private Set<User> users;
 private Set<User> activityManagers;
 }

和类用户是:

 public class User{
 private String userName;
 }

现在我想要使用Hibernate Criteria检索所有Activities User username设置为特定值,属性usersmanagers或两者。  我试过这个:

Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Activity.class, "act");
criteria.createAlias("act.activityManagers", "manager");
criteria.createAlias("act.users", "user");
criteria.add(Restrictions.disjunction().add(Restrictions.eq("manager.username", userName)).add(Restrictions.eq("user.username", userName)));
criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

它运作不正常。我做错了,我不知道。谁能帮我?谢谢

UPDATE-1   假设我有5 Activity s

First Activity:users[aaa,bbb,cccc],managers[ddddd].
Second Activity:users[userName,dddd],managers[userName,xxx,gggg].   
Third Activity:users[userName,vvvvv,bbbb],managers[sss,cccc,tttt].
Fourth Activity:users[aaa,ffff,jjjj],managers[userName,uuuu,iiiii].
Fifth Activity:users[dddd,ffff],managers[jjjjj,iiii].

结果必须是第二,第三,第四活动。但我只获得了Thired Activity。

2 个答案:

答案 0 :(得分:0)

您是否尝试过单元测试代码?

我发现您的条件中使用activityManagers与活动类中的managers相比。

criteria.createAlias("act.activityManagers", "manager");

也许这可能是你没有结果2 managers的原因?

答案 1 :(得分:0)

Hibernate正在做你要求他做的事情,但你可能没有得到你想要的查询。

将其添加到您的hibernate.cfg文件中:

<property name="hibernate.show_sql">true</property>

然后从您的应用程序触发查询并从控制台复制生成的查询,并直接在您的sql intarface中进行尝试,您将了解生成的内容以及您真正想要的内容。