我想使用 Spring 数据检索所有包含给定名称的产品,并且至少属于给定类别集合中的一个类别。
通过方法名称执行此操作可以正常工作(请不要介意字段名称中的葡萄牙语微妙之处):
Page<Produto> findDistinctByNomeContainingAndCategoriasIn(String nome, Set<Categoria> categorias, Pageable pageRequest);
我的测试 URI 是:
http://localhost:8080/produtos?nome=or&categorias=1,4
但是,我想构建等效的@Query,但它不起作用:
@Query("SELECT DISTINCT obj FROM Produto obj WHERE obj.nome LIKE %:nome% AND obj.categorias IN :categorias")
Page<Produto> findDistinctByNomeContainingAndCategoriasIn(@Param("nome") String nome, @Param("categorias") Set<Categoria> categorias, Pageable pageRequest);
响应正文中的错误:
{
"timestamp": 1507843414826,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.dao.InvalidDataAccessResourceUsageException",
"message": "could not prepare statement; SQL [select distinct produto0_.id as id1_10_, produto0_.nome as nome2_10_, produto0_.preco as preco3_10_ from produto produto0_ cross join produto_categoria categorias1_, categoria categoria2_ where produto0_.id=categorias1_.produto_id and categorias1_.categoria_id=categoria2_.id and (produto0_.nome like ?) and (. in (? , ?)) order by produto0_.nome asc limit ?]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement",
"path": "/produtos"
}
堆栈跟踪中的错误:
org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT DISTINCT PRODUTO0_.ID AS ID1_10_, PRODUTO0_.NOME AS NOME2_10_, PRODUTO0_.PRECO AS PRECO3_10_ FROM PRODUTO PRODUTO0_ CROSS JOIN PRODUTO_CATEGORIA CATEGORIAS1_, CATEGORIA CATEGORIA2_ WHERE PRODUTO0_.ID=CATEGORIAS1_.PRODUTO_ID AND CATEGORIAS1_.CATEGORIA_ID=CATEGORIA2_.ID AND (PRODUTO0_.NOME LIKE ?) AND (.[*] IN (? , ?)) ORDER BY PRODUTO0_.NOME ASC LIMIT ? "; expected "), NOT, EXISTS, INTERSECTS, SELECT, FROM, WITH"; SQL statement:
select distinct produto0_.id as id1_10_, produto0_.nome as nome2_10_, produto0_.preco as preco3_10_ from produto produto0_ cross join produto_categoria categorias1_, categoria categoria2_ where produto0_.id=categorias1_.produto_id and categorias1_.categoria_id=categoria2_.id and (produto0_.nome like ?) and (. in (? , ?)) order by produto0_.nome asc limit ? [42001-196]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.196.jar:1.4.196]
我做错了什么?如何构建与我所需查询等效的@Query?谢谢。
你可以试试
@Query("SELECT DISTINCT obj FROM Produto obj inner join obj.categorias cat WHERE obj.nome LIKE %:nome% AND cat IN :categorias")
Page<Produto> findDistinctByNomeContainingAndCategoriasIn(@Param("nome") String nome, @Param("categorias") Set<Categoria> categorias, Pageable pageRequest);
如果它不起作用,请告诉我。