hibernate JPQL查询以查找与可嵌入对象列表匹配的所有实体

x6yk4ghg  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(165)

我有一个实体,它有一个嵌入字段,可以用作该实体的业务标识符。

@Entity
public class Person {

    @Id
    @Column(name = "ID")
    private Long id;

    @Embedded
    private Identifier identifier;
}
Embeddable
public class Identifier {
    @Column(name = "business_id")
    private String businessId;

    @Column(name = "client_id")
    private Integer clientId;

    @Column(name = "dep_id")
    private Integer depId;

当我使用Spring JPARepository搜索所有实体时,其中identifier在列表中,方法是:List<Person> findByIdentifierIn(List<Identifier> identifiers);
不管我在列表中提供多少标识符,它都能正常工作。
但是我想写一个查询来连接其他表,并尝试在查询中使用这样的方法:

@Query("select p " +
            "from Person p " +
            "left join fetch p.status status " +
            "where p.identifier = :identifiers")
List<Person> findByIdentifierIn(@Param("identifiers") List<Identifier> identifiers);

现在,如果我传递一个元素列表作为标识符,它仍然可以正常工作,但是如果有多个元素,我会以错误结束,例如我得到2个元素:

the column index is out of range:3 , number of columns:2

我已经检查了执行的查询,JPARepository生成了正确处理参数的查询:

//select fields...
from users.person person0_
where (person0_.business_id, person0_.client_id, person0_.dep_id) in ((?, ?, ?), (?, ?, ?), (?, ?, ?))

但是我写的查询的结尾是这样的:

where (person0_.business_id, person0_.client_id, person0_.dep_id) = (?, ?);

我如何编写一个查询,将在列表中的多个标识符正确处理?
我期望我的查询将以与JPARepository生成的查询相同的方式工作。
我已经尝试从查询中删除任何额外的部分,如连接,以排除它们的影响,但我不确定如何修改它才能按预期工作。

ldioqlga

ldioqlga1#

生成与JpaRepository相同的结果。你应该稍微改变一下查询。
大概是这样的:

@Query("select p " +
            "from Person p " +
            "left join fetch p.status status " +
            "where p.identifier IN (:identifiers)")
List<Person> findByIdentifierIn(@Param("identifiers") List<Identifier> identifiers);

相关问题