2015-06-11 103 views
0

我有兩個具有一對多關係的實體。我想獲得與其他實體集合相關的所有實體 。這是我的課:爲什麼Spring Data JPA + Hibernate生成不正確的SQL?

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,我該如何解決它?

+0

你100%肯定春天數據JPA是*應該*支持的集合作爲參數,而實際上是定義的行爲嗎? – EpicPandaForce

+0

您是否嘗試使用@Query(「select ...」)標記自己定義查詢? http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query – Nils

+0

@Ajan已經提供了正確的答案。我在查詢方法的末尾錯過了「In」。 – stevecross

回答

4

根據彈簧數據spec你必須定義這個方法爲:

List<Instance> findByActionsIn(Collection<Action> actions); 
相關問題