Java 从HQL获取具有特殊字符的数据

Java 从HQL获取具有特殊字符的数据,java,spring,hibernate,hql,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]

我有一个搜索功能,是在我当前的项目上实现的,我正在使用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])uxyz]HU.xlsx

调试步骤

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

String newsearchString = searchString.replaceAll("(?=[]\\[+&|!(){}^\"~*?:\\\\_])  ", "/");
我也尝试过,没有替换特殊字符-它不会被返回


如何在HQL中转义字符?

HQL没有现成的正则表达式。您必须修改特定数据库的方言才能添加该功能。()

如果您只是尝试将like与
%
通配符一起使用,则可以执行以下操作:

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+"%");

这是你问题的解决方案……它应该能满足你的需要

1) 查找并替换所有转义字符,并替换为“\\” 示例:[hi]\u mysearch应该像\\[hi\\]\u 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);