2013-01-10 118 views
10

我想查询使用Hibernate标准/限制like有部分关键词的Postgres:冬眠限制像

Criterion c1 = Restrictions.like("stateName", "Virg*"); 
cri.add(c1); 

return cri.list(); 

它不返回任何东西,但Restrictions.like("stateName", "Virginia");返回正确的记录。我如何使用hibernate中的部分限制?

编辑: 得到它的工作做这样的事情:

public static List<Object> createQueryStringByRegex(Criteria cri, 
     Parameters p) { 
    String value = (String) p.value; 
    if (value.contains("*")) { 
     value = value.replace("*", "%"); 
    } else { 
     value += "%"; 
    } 
    // System.out.println("Value: "+value); 
    Criterion c1 = Restrictions.ilike(p.property, value); 
    cri.add(c1); 

    return cri.list(); 

} 

回答

44

使用枚举MatchMode来帮助你吧:

Criterion c1 = Restrictions.like("stateName", "Virg", MatchMode.END); 

不要使用任何特殊字符,如*。如果您想要不区分大小写,请使用ilike

+0

不使用'ilike'取决于底层数据库是否支持它?即Postgres支持ilike,但其他人可能不支持? – mmcrae

+1

我不相信,至少在文档中没有任何关于它的内容。可能Hibernate本身提供了这个功能。 –

+0

为了他的问题,不应该将MatchMode设置为MatchMode.START? – DanielK

9

的限制,应使用百分比符号。

Criterion c1 = Restrictions.like("stateName", "Virg%"); 
+2

如果您按照Juliano的回答建议的那样使用MatchMode,那么您可以更灵活地选择或迁移到哪个数据库。 – DanielK

+0

只需使用MatchMode,这是首先破坏了使用API​​的原因之一,这对于您的代码是数据库不可知的! – Willa