3

我正在尝试在 Hibernate SQL 查询中使用 COLLATE 语句,但是它无法识别该语句。

CONSULTA: FROM Articulos WHERE activo=0 
              and (codigodearticulo like '%CIN EMB%' COLLATE='Modern_Spanish_CI_AI'
              or descripcion like '%CIN EMB%' COLLATE='Modern_Spanish_CI_AI'  
              or descripcionadicional like '%CIN EMB%' COLLATE='Modern_Spanish_CI_AI' )
              and codigodelinea in
              (select CODIGODELINEA from Lineas where CATAUTOPARTES='1')

当应用程序编译时,Hibernate 返回此异常:

- line 1:107: unexpected token: COLLATE
- line 1:107: unexpected token: COLLATE
- line 1:107: unexpected token: COLLATE
- Error hibernate: unexpected token: COLLATE near line 1, column 107

我找不到问题,在 MSSQL Server 中它工作正常。

4

2 回答 2

2

不幸的是,HQL 并不能完全替代 SQL,而且似乎根本不允许指定排序规则。

它可以在 Criteria 查询中指定。看到这个答案

于 2013-07-16T20:56:02.920 回答
0

而不是在 HQL 中:

String hql = "SELECT e" +
    " FROM EntityJPA e" +
    " WHERE e.mycolumn COLLATE 'utf8_bin' = 'VALUE'"

Query query = entityManager.createQuery(hql);

您可以像这样使用本机查询

String sql = "SELECT t" +
    " FROM entity_table t" +
    " WHERE t.mycolumn COLLATE 'utf8_bin' = 'VALUE'" 

并以原生查询方式执行它:

Query query = entityManager.createNativeQuery(sql);

这是一个更简单的解决方案,因为要记住本机查询会创建对目标数据库的 SQL 语言(在我们的例子中是 mySQL)的依赖。

对我们来说,这仍然是可以接受的,因为使用不同数据库引擎的可能性非常低。

于 2021-09-17T12:10:37.703 回答