Hibernate Criteria如何实现多个关联子条件之间的OR逻辑
问题诊断
你当前的实现思路不正确。直接为每个关联创建子Criteria并单独添加限制时,Hibernate默认会将所有子Criteria的限制条件用AND逻辑拼接,和你需要的OR逻辑不符。
正确实现方案
不需要创建多个独立的子Criteria,给三个外键关联的User实体分别指定不同的别名,再组合条件即可,代码如下:
Criteria prodCriteria = session.createCriteria(Prod.class); // 给三个外键关联的User分别指定唯一别名 prodCriteria.createAlias("userId1", "u1"); prodCriteria.createAlias("userId2", "u2"); prodCriteria.createAlias("userId3", "u3"); // 分别构造三个关联用户的匹配条件 Criterion user1Cond = Restrictions.and( Restrictions.ilike("u1.firstname", firstname, MatchMode.ANYWHERE), Restrictions.ilike("u1.lastname", lastname, MatchMode.ANYWHERE) ); Criterion user2Cond = Restrictions.and( Restrictions.ilike("u2.firstname", firstname, MatchMode.ANYWHERE), Restrictions.ilike("u2.lastname", lastname, MatchMode.ANYWHERE) ); Criterion user3Cond = Restrictions.and( Restrictions.ilike("u3.firstname", firstname, MatchMode.ANYWHERE), Restrictions.ilike("u3.lastname", lastname, MatchMode.ANYWHERE) ); // 把三个条件用OR逻辑拼接后加到主查询 prodCriteria.add(Restrictions.or(user1Cond, user2Cond, user3Cond));
补充说明
- 该写法生成的SQL会自动关联三次User表,分别对应三个外键,和你给出的伪查询逻辑完全一致
- 注意你原有代码里的字段拼写错误:
firstame漏掉了字母n,修正为firstname才能正常查询
内容的提问来源于stack exchange,提问作者user10485689
相关产品推荐
相关产品推荐

