在Hibernate中构建case语句

在Hibernate中构建case语句,hibernate,Hibernate,我有两个字段emailid1Status和emailid2Status。如果emailid1status为true,那么我必须将给定的电子邮件与emailId1列进行比较,并与emailid2Status进行比较。如何在Hibernate中实现这一点 下面我试过了,但没有运气 from User where user.emailId = email OR user.emailid1 = select case when user.emailid1Status is 0 then null

我有两个字段emailid1Status和emailid2Status。如果emailid1status为true,那么我必须将给定的电子邮件与emailId1列进行比较,并与emailid2Status进行比较。如何在Hibernate中实现这一点

下面我试过了,但没有运气

   from User where user.emailId = email OR user.emailid1 = select case when user.emailid1Status is 0 then null   else email OR user.emailid2 =  select case when user.emailid2Status is 0 then null else 
   user.emailid2 = email
   end
更新 使用下面的SQL查询获得正确的结果。有人能告诉我如何将其转换为HQL吗?或者可以使用CriteriaAPI吗

select * FROM user_profile a WHERE a.emailId = 'test@gmail.com' or a.emailId1 = (CASE WHEN a.emailId1_status THEN 'test@gmail.com' ELSE '' END) or a.emailId2 = (CASE WHEN a.emailId2_status THEN 'test@gmail.com' ELSE '' END)

您没有提到email1Status1和emailStatus2都是正确的。根据上述sql,假设or更合适。

如果要使用HQL,则查询将为:

session.createQuery("FROM User user "
          + "WHERE user.emailId = 'test@gmail.com' "
          + "or user.emailId1 = (CASE user.emailId1Status WHEN TRUE THEN 'test@gmail.com' ELSE '' END) "
          + "or user.emailId2 = (CASE user.emailId2Status WHEN TRUE THEN 'test@gmail.com' ELSE '' END)");

它们可以都是真的,也可以任意一个都是真的,如果是真的,我只需要将其置于条件中。是的,我希望NVL2可以工作,但如何在Hibernate中实现这一点。Hibernate还提供本机SQL,您可以在EntityManager API中找到。但是你最好检查一下你的数据库是否支持NVL2。你试过标准了吗?@looser,你能给我一个代码吗。我已经试过了,但没有成功。