2014-08-28 55 views
1

我想对输入的字符串执行搜索操作。无论用户输入什么内容,都应该在名字和姓氏列上进行搜索。结合Hibernate中的2个或更多属性限制条件查询

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

在上面的代码中,我组合了两列并对它进行搜索。我想要使​​用休眠条件的类似功能。 我曾尝试下面的查询,但它didn`t工作

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

我知道这仅仅是或condition..please让我知道有没有办法合并两个列,并完成使用条件查询

+0

什么“没有工作”呢?你可以说得更详细点吗?你在那里看起来是正确的。 – 2014-08-28 11:16:41

+0

该条件查询分别检查两列和'ORing'的结果。我想结合这两列然后对其执行搜索操作。 – sar 2014-08-28 11:22:39

回答

2

你不能用Restrictions来做到这一点。

我强烈建议在HQL中使用它,而不要在Criteria实例中使用SQL限制。如果您开始使用SQL,那么您有可能破坏可移植性:Hibernate的要点是将该层抽象出来。

有关更多详细信息,请参见this SO question

1

搜索它不可能这样做。由于您需要合并两列。所以请在sqlRestrinctions中尝试。

0

有一个办法,例如在你的映射添加hbm.xml文件中这(||意味着甲骨文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; 
} 

终于之后,你可以得到这个级联在restrinction:

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

PS:如果你是直接映射在Java上我们使用这种方式公式:

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

if ||请勿使用:concat(concat(FST_NAME,''),LAST_NAME) – Diego87 2016-10-11 13:50:57