【问题标题】:Java Hibernate / Spring, doing partial match query ("contains")?Java Hibernate / Spring,做部分匹配查询(“包含”)?
【发布时间】:2011-07-06 22:08:59
【问题描述】:

我对休眠还很陌生,似乎无法找到如何做到这一点,也许我正在使用错误的术语进行搜索。我正在从我的 UI 中传递用户提供的值,在下面的示例中,这是变量 testvalue。它用于进行搜索,因此如果用户输入的内容包含在条目e.filenametxt 的任何位置,我希望它将该行作为匹配项返回。

例如testvalue = "file1",我希望它能够找到e.filenametxt = "file1/someotherinfo/"所在的行

String SQL_QUERY = "from EdrmTest e where e.filenametxt is :foreignkeytest ";
Query query = session.createQuery(SQL_QUERY);
query.setParameter("foreignkeytest", testvalue);

感谢任何建议。

【问题讨论】:

  • 作为对答案的补充,我想提一下,有一种叫做休眠搜索的东西,它在幕后使用了 lucene。它解决了同样的问题,但功能更强大且可扩展。

标签: java hibernate spring hql


【解决方案1】:
String SQL_QUERY = "from EdrmTest e where e.filenametxt LIKE :foreignkeytest ";
Query query = session.createQuery(SQL_QUERY);
query.setParameter("foreignkeytest", "%" + testvalue + "%");\

试试看。通配符需要在变量中(出于某种原因)。

【讨论】:

  • +1 感谢您指出“%”需要在参数中,这在我阅读的任何文档中都不清楚,我无法让它工作。
【解决方案2】:

您也可以使用the Criteria API 以编程方式设置这些类型的子句;有时,如果您需要添加任何类型的动态逻辑(即基于条件包含某些子句),使用此 API 处理查询会比基于 HQL/String 的查询更好。

Criteria crit = session.createCriteria(EdrmTest.class); //the persistent class goes here
crit.add( Restrictions.like("filenametxt", testvalue + "%") );
//execute the query:
List<EdrmTest> results = (List<EdrmTest>) crit.list();

【讨论】:

  • 同样有效,文本更少,程序化更多,但绝对有效。
  • 如果你想不区分大小写并且想在任何地方匹配,那么请看这篇文章stackoverflow.com/questions/120588/…
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 2020-12-09
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2018-11-30
  • 2022-09-23
相关资源
最近更新 更多