【发布时间】: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