来自Hibernate Criteria API的限制

Big*_*va2 13 hibernate criteria

我试图使用Hibernate的限制标准like()和部分关键字查询PostgreSQL数据库:

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

return cri.list();
Run Code Online (Sandbox Code Playgroud)

它不会返回任何内容,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();

}
Run Code Online (Sandbox Code Playgroud)

Jul*_*ves 56

使用枚举MatchMode来帮助您:

Criterion c1 = Restrictions.like("stateName", "Virg", MatchMode.START);
Run Code Online (Sandbox Code Playgroud)

不要使用任何特殊字符,例如*.如果你想要一个不区分大小写的,请使用ilike.

  • 我不相信,至少文档中没有任何相关内容.可能Hibernate本身就提供了这个功能. (2认同)
  • @Juliano实际上MatchMode.START是正确的,因为它告诉hibernate从一开始就匹配.也就是说,如果你将它转换为mysql实现,它将成为'SELECT*FROM <table>,其中<column> LIKE"参数%" (2认同)

Man*_*nes 11

限制应使用百分比符号.

Criterion c1 = Restrictions.like("stateName", "Virg%");
Run Code Online (Sandbox Code Playgroud)

  • 如果您按照Juliano的回答建议使用`MatchMode`,那么您将来可以更灵活地选择或迁移到哪个数据库. (4认同)