【问题标题】:how to add Hibernate "createAlias" Child Restriction to parent Entity Restriction如何将 Hibernate“createAlias”子限制添加到父实体限制
【发布时间】:2014-04-05 11:15:14
【问题描述】:

我有一个要求,我需要将搜索关键字应用于父实体(客户)的名称和状态以及子实体 Order 的名称属性。

List<Criterion> aliasRestrictionsCriterion = new ArrayList<Criterion>();
Junction quotedLikeRestrictions = Restrictions.disjunction();
quotedLikeRestrictions.add(Restrictions.ilike("customerName", token, MatchMode.ANYWHERE));
quotedLikeRestrictions.add(Restrictions.ilike("customerState", token, MatchMode.ANYWHERE));
restrictions.add(quotedLikeRestrictions);

为了在查询中包含子表,我正在执行以下操作

Criteria alias = criteria.createAlias("order", "order")
.add(Restrictions.ilike("order.name", token, MatchMode.ANYWHERE));

Hibernate 正在生成以下查询,但我需要将 order.name 之类的比较添加到父块中。

CUSTOMER this_ inner join ORDER order_ on this_.ORDER_ID=order_.ORDER_ID where 
(lcase(this_.name) like ? or lcase(this_.state) like ?) and (lcase(order_.NAME) 
like ?)        

我想要的是 (lcase(order_.NAME) like ?) 在父块内。所以我想要的是以下

(lcase(this_.name) like ? or lcase(this_.state) like ? or lcase(order_.NAME) like ?)

我怎样才能做到这一点?

更新:这就是我所说的标准

protected List getEntities(List<Criterion> restrictions, String aliasSearchToken) {
    Session session = currentSession();
    Criteria criteria = session.createCriteria(getEntityClass());

    // apply restrictions.
    if (restrictions != null) {
        for (Criterion criterion : restrictions) {
            criteria.add(criterion);
        }
    }

    Criteria alias = criteria.createAlias("order", "order").add(Restrictions.ilike("order.name", searchToken, MatchMode.ANYWHERE));

    List list = criteria.list();
    if (list != null) {
        return list;
    }
    return Collections.emptyList();
}

更新 2:

protected List getEntities(List<Criterion> restrictions, String aliasSearchToken) {
    Session session = currentSession();
    Criteria criteria = session.createCriteria(getEntityClass());

    Junction or = Restrictions.disjunction();
    or.add(Restrictions.ilike("order.name", searchToken, MatchMode.ANYWHERE));
    criteria.createAlias("order", "order").add(or);


    // apply restrictions.
    if (restrictions != null) {
        for (Criterion criterion : restrictions) {
            criteria.add(criterion);
        }
    }

    List list = criteria.list();
    if (list != null) {
        return list;
    }
    return Collections.emptyList();
}

生产 select ....... from CUSTOMER this_ inner join ORDER order_ on this_.ORDER_ID=order_.uid where (lcase(order_.NAME) like ?) and (lcase(this_.name) like ? or lcase(this_.state ) 喜欢?)

orderName 就在之前,但仍然不在第二个 or 语句中……我很困惑。

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    好吧,除了将限制添加到 Criteria(创建 AND)之外,您必须将其添加到 quotedLikeRestrictions 析取:

    quotedLikeRestrictions.add(Restrictions.ilike("order.name", token, MatchMode.ANYWHERE));
    

    【讨论】:

    • 这就是我首先尝试的,我得到了这个异常 org.hibernate.QueryException: could not resolve property: order.name of: com.company.dao.entities.Customer。
    • 可能是因为您在创建别名之后而不是之前创建别名。如果您发布了完整的 Criteria 创建代码,它会更容易提供帮助。
    • 当前模式是在服务层创建限制并将其传递给 DAOBase 抽象类,DAO 所针对的当前实体基于该抽象类获取实体类,然后调用条件和 I '在将限制应用于条件后调用 createAlias。我以前应该这样做吗?
    • 是的。如果限制使用别名,则别名必须存在。
    • 但是你没有改变任何东西。必须在添加限制之前创建别名,并且必须将 order.name 的限制添加到析取项中,而不是添加到 Criteria 中。如果您不对代码进行任何更改,那么结果也不会发生任何更改。
    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多