使用HQL中的特殊字符获取数据

时间:2016-06-13 20:32:46

标签: java spring hibernate hql

我有一个在我当前项目上实现的搜索功能,我正在使用HQL作为repo方法 - 除了因为某些原因搜索特殊字符外,一切都还可以.HQL没有逃脱它。

 @Query("SELECT f FROM Item f WHERE f.id=:id AND f.itemNm LIKE %:itemNm %")
 Item findByItemNm(@Param("itemNm ") String itemNm, @Param("id") Long id);

我发送的字符串搜索是

  

abc_xyz(YYYYMM [T-2] -YYYYMM [T-1])_ [XYZ] HU.xlsx

调试步骤

在发送回Repo之前 - 我确实用以下内容替换了所有特殊字符-newsearchString是传递给repo的那个

String newsearchString = searchString.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\_])  ", "/");

我也尝试了它而没有替换特殊字符 - 它没有被返回

如何在HQL中转义字符?

2 个答案:

答案 0 :(得分:1)

以下是您的问题的解决方案......它应该适合您的需要。

1)查找并替换所有的逃逸特征,并替换为" \\"    示例:[hi] _mysearch应该替换为 \\ [hi \\] _ mysearch

2)更改您的回购查询,如下所示

 @Query("SELECT f FROM Item f WHERE f.id=:id AND f.itemNm LIKE %:itemNm % escape '\\'")
 Item findByItemNm(@Param("itemNm ") String itemNm, @Param("id") Long id);

答案 1 :(得分:0)

HQL没有开箱即用的正则表达式。您必须修改特定数据库的Dialect才能添加该功能。 (Oracle example

如果您只是尝试使用%通配符,那么您可以执行以下操作:

String itemNm = "abc_xyz(YYYYMM[t-2]-YYYYMM[t-1])_[xyz]HU.xlsx";
Query q = session.createQuery("from Item where itemNm like :itemNm ";
q.setString("itemNm","%"+itemNm+"%");