Hibernate Spring数据JPA-无法重用参数

Hibernate Spring数据JPA-无法重用参数,hibernate,spring-data-jpa,Hibernate,Spring Data Jpa,我试图使用SpringDataJPA来选择一个包含所有提供参数值的实体 我的实体如下所示: @Entity @Table(name = "books", schema = Constants.BENCHMARKS) @NamedEntityGraph(name = "BookEntity.all", attributeNodes = @NamedAttributeNode("aliases")) public class BookEntity { @Id private Stri

我试图使用SpringDataJPA来选择一个包含所有提供参数值的实体

我的实体如下所示:

@Entity
@Table(name = "books", schema = Constants.BENCHMARKS)
@NamedEntityGraph(name = "BookEntity.all", attributeNodes = @NamedAttributeNode("aliases"))
public class BookEntity
{
    @Id
    private String isbn = UUID.randomUUID().toString();

    @Column(name = "title")
    private String title;

    @Column(name = "description")
    private String description;

    @CollectionTable(schema = Constants.BENCHMARKS, name = "book_tags", joinColumns = @JoinColumn(name = "book_isbn"))
    @ElementCollection(fetch = FetchType.EAGER)
    private List<String> aliases;
}
我已经看过了,这是我的原始语法。我还查看了许多其他帖子,但没有一篇真正尝试在查询中重用参数。当然,它们中没有一个是作为示例的基础工作的(这里我甚至没有混合实体)

我想用一个实际问题来总结一下,我的查询语法有什么问题导致它正确解析

响应:再次尝试包含该参数

第二次传入参数并没有改变结果,它仍然抱怨冒号,这使我相信它实际上不是重用问题,而是计数问题

响应:尝试使用大小而不是计数

将计数更改为大小导致新错误

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unexpected expression ? found for collection function size [SELECT x FROM org.cubrc.example.hibernate.books.BookEntity x WHERE x IN (    SELECT y FROM org.cubrc.example.hibernate.books.BookEntity y    INNER JOIN y.aliases yt    WHERE yt IN (        :aliases    )    GROUP BY y    HAVING COUNT( DISTINCT yt) = SIZE(        :aliases)    )]
工作变通方法:

我尝试手动使用大小,如下所示

@EntityGraph(value = "BookEntity.all", type = EntityGraphType.LOAD)
@Query("SELECT x FROM BookEntity x " + 
        "WHERE x IN (" + 
        "    SELECT y FROM BookEntity y" + 
        "    INNER JOIN y.aliases yt" + 
        "    WHERE yt IN (" + 
        "        :aliases" + 
        "    )" + 
        "    GROUP BY y" + 
        "    HAVING COUNT( DISTINCT yt) = (" + 
        "        :aliasesSize)" + 
        "    )")
Iterable<BookEntity> findAllByAliasesContainsAll(@Param("aliases") Collection<String> aliases, @Param("aliasesSize") long aliasesSize);
@EntityGraph(value=“BookEntity.all”,type=EntityGraphType.LOAD)
@查询(“从BookEntity x中选择x”+
其中x在(“+
“从账簿实体y中选择y”+
“内部连接y.别名yt”+
“其中yt在(“+
“:别名”+
"    )" + 
“y分组”+
“具有计数(不同的yt)=(“+
“:别名大小)”+
"    )")
Iterable findAllByAliasesContainsAll(@Param(“别名”)集合别名,@Param(“别名”)长别名;

这样做有效,所以我现在就用它。但是,最好不要让用户在我只需要一个参数的情况下传递两个参数。

实际问题似乎是您试图使用参数作为
count()
函数的参数,这是不期望的。据我所知,这个想法是用参数集合的大小来检查结果。为此,您可以尝试使用'SIZE()'JPA函数或将别名的长度作为另一个参数传递。

如果您将别名列表传递两次并使用不同的
@Param
名称,是否有效?
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unexpected expression ? found for collection function size [SELECT x FROM org.cubrc.example.hibernate.books.BookEntity x WHERE x IN (    SELECT y FROM org.cubrc.example.hibernate.books.BookEntity y    INNER JOIN y.aliases yt    WHERE yt IN (        :aliases    )    GROUP BY y    HAVING COUNT( DISTINCT yt) = SIZE(        :aliases)    )]
@EntityGraph(value = "BookEntity.all", type = EntityGraphType.LOAD)
@Query("SELECT x FROM BookEntity x " + 
        "WHERE x IN (" + 
        "    SELECT y FROM BookEntity y" + 
        "    INNER JOIN y.aliases yt" + 
        "    WHERE yt IN (" + 
        "        :aliases" + 
        "    )" + 
        "    GROUP BY y" + 
        "    HAVING COUNT( DISTINCT yt) = (" + 
        "        :aliasesSize)" + 
        "    )")
Iterable<BookEntity> findAllByAliasesContainsAll(@Param("aliases") Collection<String> aliases, @Param("aliasesSize") long aliasesSize);