我试图通过将第二个参数传递给带有列表大小的方法来避免冗余。相反,我使用EL,但我有一个错误:
org.hibernate.QueryException:并非所有命名参数都已设置: [ $ synthetic $ __ 1] [SELECT distinct b FROM Book b join b.bookHashtags as ht where ht.hashtagName in:tags by b.uniqueIdentifier having count(ht.uniqueIdentifier)=: $ synthetic $ __ 1]
@Repository
public interface BookRepository extends JpaRepository<Book, Long>, JpaSpecificationExecutor<Book> {
@Query("SELECT distinct b FROM Book b join b.bookHashtags as ht where ht.hashtagName in :tags " +
"group by b.uniqueIdentifier having count(ht.uniqueIdentifier) = :#{#tags.size()}")
List<Book> findAllBooksContainedTags(@Param("tags") Set<String> tags);
}
我使用spring-data-jpa 1.11.0.RELEASE。我知道这个功能是在1.4版本中开发的。为什么它在我的案例中不起作用......
答案 0 :(得分:2)
答案很简单:没有实现/支持任意表达式。
请仔细检查有关Using SpEL expressions
的Spring Data JPA文档从Spring Data JPA 1.4版开始,我们通过@Query支持在手动定义的查询中使用受限制的SpEL模板表达式
支持的表达式表只包含
变量:entityName
用法:从#{#entalName} x
中选择x描述:插入与给定存储库关联的域类型的entityName。 entityName的解析如下:如果域类型在@Entity注释上设置了name属性,那么将使用它。否则,将使用域类型的简单类名。