繁体   English   中英

在Hibernate Restrictions条件查询中组合2个或更多属性

[英]combining 2 or more properties in Hibernate Restrictions criteria query

我想对输入的字符串执行搜索操作。 无论输入什么用户,都应该在“名字和姓氏”列上进行搜索。

   //pseudo hql query
     Select   E.someproperty ....  from  Entity E    where   upper(E.firstName || '' || E.lastName)  like  upper(+userEntered+'%')  // 

在上面的代码中,我合并了两列并在其上进行了搜索。 我想要使​​用休眠条件的类似功能。 我尝试了以下查询,但是没有用

 empCriteria.add(Restrictions.disjunction().add(Restrictions.ilike("firstName",  
   userEntered, MatchMode.START)).add(Restrictions.ilike("lastName", userEntered, 
MatchMode.START))); 

我知道这是公正的还是有条件的。

您不能通过Restrictions来做到这一点。

我强烈建议您在HQL中这样做,而不要在Criteria实例中使用SQL限制。 如果您开始使用SQL,就有可能破坏可移植性:Hibernate的目的是将这一层抽象掉。

有关更多详细信息,请参见此SO问题

您可以将Resrtictions.sqlRestriction()与SQL子句一起使用。

不可能那样做。 由于您需要合并两列。 因此,请尝试使用sqlRestrinctions。

有一种方法,例如在映射hbm.xml文件中添加this(||在oracle中表示concat):

<property name="completeName"
   formula="FST_NAME || ' ' || LAST_NAME"/>  

只需在Java bean中添加新属性:

private String completeName;
public String getCompleteName() {
    return completeName;
}
public void setCompleteName(String completeName) {
    this.completeName = completeName;
}

最终,您可以在重新定义中得到此串联:

Criteria.add(Restrictions.like("completeName","%"+userEntered+"%").ignoreCase();

ps:如果您直接在java bean上映射,则公式将以这种方式:

@Formula(value="FST_NAME || ' ' || LAST_NAME")
private String completeName;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM