为什么SpEL支持在Spring Data JPA @Query中不起作用?

时间:2017-10-19 16:37:12

标签: java spring hibernate spring-data-jpa spring-el

我试图通过将第二个参数传递给带有列表大小的方法来避免冗余。相反,我使用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版本中开发的。为什么它在我的案例中不起作用......

1 个答案:

答案 0 :(得分:2)

答案很简单:没有实现/支持任意表达式。

请仔细检查有关Using SpEL expressions

的Spring Data JPA文档
  

从Spring Data JPA 1.4版开始,我们通过@Query支持在手动定义的查询中使用受限制的SpEL模板表达式

支持的表达式表只包含

  

变量:entityName

     

用法:从#{#entalName} x

中选择x      

描述:插入与给定存储库关联的域类型的entityName。 entityName的解析如下:如果域类型在@Entity注释上设置了name属性,那么将使用它。否则,将使用域类型的简单类名。