【问题标题】:Hiberate criteria - OR between criteria?休眠标准 - 或标准之间?
【发布时间】:2021-10-19 14:08:53
【问题描述】:

我有一个表 Prod,它与表 User 有 3 个 fk 关系:

Prod
-----
id
user_id_1
user_id_2
user_id_3

User
-----
id
firstname
lastname

鉴于搜索表单上可能存在 firstname> 和 lastname>,我想做类似(伪代码)的操作:

Find all Prod 
where
(user_id_1.firstname like <firstname> AND user_id_1.lastname like <lastname>) OR
(user_id_2.firstname like <firstname> AND user_id_2.lastname like <lastname>) OR
(user_id_3.firstname like <firstname> AND user_id_3.lastname like <lastname>)

使用 Hibernate 的 Criteria 对象,我相信执行关联表操作的方法是使用额外的 Criteria 对象:

Criteria prodCriteria = session.createCriteria(Prod.class);
Criteria user1Criteria = prodCriteria.createCriteria("userId1");
LogicalExpression user1Le = Restrictions.and(Restrictions.ilike("firstame", <firstname>, MatchMode.ANYWHERE), Restrictions.ilike("lastname", <lastname>, MatchMode.ANYWHERE));
user1Criteria.add(user1Le);

Criteria user2Criteria = prodCriteria.createCriteria("userId2");
LogicalExpression user2Le = Restrictions.and(Restrictions.ilike("firstame", <firstname>, MatchMode.ANYWHERE), Restrictions.ilike("lastname", <lastname>, MatchMode.ANYWHERE));
user2Criteria.add(user2Le);

Criteria user3Criteria = prodCriteria.createCriteria("userId3");
LogicalExpression user3Le = Restrictions.and(Restrictions.ilike("firstame", <firstname>, MatchMode.ANYWHERE), Restrictions.ilike("lastname", <lastname>, MatchMode.ANYWHERE));
user3Criteria.add(user3Le);

但是,这不会在我想要 OR 的关联 sub-criteria 对象之间产生 AND 吗?

有没有办法在 sub-criteria 对象之间执行 OR?我这样做是否正确?

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    您可以通过使用显式别名来实现它:

    Criterion criterionUser1 = Restrictions.and(Restrictions.ilike("user1.firstname", firstname, MatchMode.ANYWHERE),
                    Restrictions.ilike("user1.lastname", lastname, MatchMode.ANYWHERE));
    Criterion criterionUser2 = Restrictions.and(Restrictions.ilike("user2.firstname", firstname, MatchMode.ANYWHERE),
                    Restrictions.ilike("user2.lastname", lastname, MatchMode.ANYWHERE));
    Criterion criterionUser3 = Restrictions.and(Restrictions.ilike("user3.firstname", firstname, MatchMode.ANYWHERE),
                    Restrictions.ilike("user3.lastname", lastname, MatchMode.ANYWHERE));
    
            Criteria prodCriteria2 = session
                                        .createCriteria(Prod.class)
                                        .createAlias("userId1", "user1")
                                        .createAlias("userId2", "user2")
                                        .createAlias("userId3", "user3")
                                        .add(Restrictions.or(criterionUser1, criterionUser2, criterionUser3));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 2012-12-24
      • 2014-09-30
      • 2011-08-13
      • 2011-04-11
      • 1970-01-01
      相关资源
      最近更新 更多