为什么Spring Data JPA + Hibernate生成错误的SQL?

时间:2015-06-11 10:59:44

标签: java spring hibernate spring-data-jpa

我有两个具有一对多关系的实体。我想获得所有实体 与一组另一个实体相关联的。这是我的课程:

public class Instance {

    @Id
    @GeneratedValue
    private long id;

    @OneToMany(mappedBy = "instance")
    private Set<Action> actions = new HashSet<>();

}

public class Action {

    @Id
    @GeneratedValue
    private long id;

    @ManyToOne
    @JoinColumn(name = "instance_id")
    private Instance instance;

}

此外,我有以下存储库:

public interface InstanceRepository extends JpaRepository<Instance, Long> {

    List<Instance> findByActions(Set<Action> actions);

}

当我使用空元素集或单个元素集调用方法时,我没有错误。但是如果集合包含更多元素 我得到一个例外。 MySQL说Operand should contain 1 column(s)。生成的空元素或单个元素的SQL 集是

select instance0_.id as id1_3_
from instance instance0_
left outer join action actions1_
on instance0_.id=actions1_.instance_id
where actions1_.id=?

和其他套装

select instance0_.id as id1_3_
from instance instance0_
left outer join action actions1_
on instance0_.id=actions1_.instance_id
where actions1_.id=(?, ?, ?, ...)

这显然是错误的,应该是

select instance0_.id as id1_3_
from instance instance0_
left outer join action actions1_
on instance0_.id=actions1_.instance_id
where actions1_.id in (?, ?, ?, ...)

为什么Hibernate会生成这个SQL,我该如何修复它?

1 个答案:

答案 0 :(得分:4)

根据Spring Data spec,您必须将此方法定义为:

List<Instance> findByActionsIn(Collection<Action> actions);