У меня есть два объекта с отношением «один ко многим». Я хочу получить все объекты , привязанные к набору другого объекта. Это мои классы:Почему 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 и как его исправить?
вы 100% уверены Spring Data JPA является * предполагается * для поддержки коллекций в качестве параметра, и что поведение фактически определяется? – EpicPandaForce
Вы пытались определить запрос самостоятельно, используя тег @Query («select ...»)? http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query – Nils
@Ajan уже предоставил правильный ответ. В конце метода запроса мне не хватало 'In'. – stevecross