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

问题描述 投票:0回答:1

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

@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 使用以下方法搜索标识符位于列表中的所有实体时:

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 生成的查询相同的方式工作。

我尝试从查询中删除任何额外的部分(例如联接),以排除它们的影响,但我不确定如何修改它以按预期工作。

java hibernate jpa jpql
1个回答
0
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.