gpt4 book ai didi

java - 如何将 Hibernate "createAlias"子限制添加到父实体限制

转载 作者:行者123 更新时间:2023-12-01 13:19:25 25 4
gpt4 key购买 nike

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

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 之类的比较添加到父 block 中。

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 ?)

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

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

已制作 select ....... from CUSTOMER this_inner join ORDER order_ on this_.ORDER_ID=order_.uid where (lcase(order_.NAME) like ?) 和 (lcase(this_.name) like ? 或 lcase(this_.state )喜欢?)

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

最佳答案

好吧,您必须将其添加到 quotedLikeRestrictions 析取中,而不是将限制添加到 Criteria(这会创建 AND):

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

关于java - 如何将 Hibernate "createAlias"子限制添加到父实体限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22163158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com