我有一个实体,它有一个嵌入字段,可以用作该实体的业务标识符。
@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生成的查询相同的方式工作。
我已经尝试从查询中删除任何额外的部分,如连接,以排除它们的影响,但我不确定如何修改它才能按预期工作。
1条答案
按热度按时间ldioqlga1#
生成与
JpaRepository
相同的结果。你应该稍微改变一下查询。大概是这样的: