簡體   English   中英

如何將Hibernate“ createAlias”子級限制添加到父級實體限制

[英]how to add Hibernate “createAlias” Child Restriction to parent Entity Restriction

我有一個要求,我需要在父實體(客戶)的名稱和狀態以及子實體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)像?)放在父塊中。 所以我想要的是以下

(lcase(this_.name)如?或lcase(this_.state)如?或lcase(order_.NAME)如?)

我該如何實現?

更新:這就是我所說的標准

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();
}

在客戶this_.ORDER_ID = order_.uid上從客戶this_內部聯接ORDER order_中產生了選擇.......其中(lcase(order_.NAME)如?)和(lcase(this_.name)如?或lcase(this_。狀態),像?)

orderName只是在第二個或語句之前,但仍不在第二個或語句中……我很困惑。

好吧,為了將限制添加到條件中(創建一個AND),必須將其添加到quotedLikeRestrictions取中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM