我有一个带有嵌入字段的实体,可以用作该实体的业务标识符。
@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 生成的查询相同的方式工作。
我尝试从查询中删除任何额外的部分(例如联接),以排除它们的影响,但我不确定如何修改它以按预期工作。
与
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);