我有一个在我当前项目上实现的搜索功能,我正在使用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中转义字符?
答案 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+"%");