Spring 数据@Query集合 - 查找属于给定类别集合中至少一个类别的产品



我想使用 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);

如果它不起作用,请告诉我。

相关内容

最新更新