2015-06-11 2 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% уверены Spring Data 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

Согласно Spring Data spec вы должны определить этот метод:

List<Instance> findByActionsIn(Collection<Action> actions); 
Смежные вопросы