2016-12-05 6 views
0

класс Parent:JPQL не работает должным образом

@Table(name = "users") 
class User { 
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
List<Gender> genders = new ArrayList<>(); 

класс для детей:

@Table(name = "gender") 
class Gender { 
@ManyToOne(cascade = {CascadeType.ALL}) 
@JoinColumn(name = "userId", nullable = false) 
User user; 
String sex; 

моя цель в MySQL:

SELECT * FROM пользователям LEFT JOIN Genders В на .id = b.id ГДЕ b.sex = 'dasd'

Возврат 1 ROW Он работает хорошо. У меня есть только одна запись, которая соответствует этому условию.

но тот же самый код в JPQL:

ВЫБРАТЬ а из пользователей в LEFT JOIN a.genders б WHERE b.sex = 'DASD'

Возвращает: один пользователь - правильно, и все genders в таблице Пол, но я не хочу ВСЕ, хочу только, когда sex = 'dasd' и только одна запись, которая соответствует этому условию. btw JPQL генерирует N+1 issue и для каждого подзапроса, игнорируя condtion sex = 'dasd'

Как сделать записывать подзапрос, удовлетворяющий условию? Могу ли я заставить подзапрос возвращать только пол, соответствующий запросу JPQL?

+0

Не могли бы вы предоставить код сущности пола? –

+0

Я включил также Gender.java (child) – user3871754

ответ

3

В JPQL выбран из объекта не таблицы,

SELECT a FROM User a LEFT JOIN a.genders b WHERE b.sex ='dasd' 

Поскольку вы настроили список a.genders, как нетерпеливый, каждый раз, когда вы выбираете пользователь, он будет получать все полы пользователя asociated к. Даже если они не соответствуют запросу JPQL.

Если вы настроите список a.genders ленивым, он не будет получать какие-либо Пол, так как вы выбрали только от пользователя

Этот запрос эквивалентен SQL

SELECT a.* FROM users a LEFT JOIN genders b ON a.id=b.id WHERE b.sex='dasd' 

Если вы хотите выбрать только один Пол

SELECT b FROM Gender b WHERE b.user = :user AND b.sex = 'dasd' 
+0

Каждый раз, когда вы выбираете пользователя, он будет извлекать все гендерные группы, к которым привязан пользователь. Даже если они не соответствуют запросу JPQL. Да, и это проблема. Могу ли я заставить его возвращать только пол, соответствующий запросу JPQL? – user3871754

+0

Проблема в том, что вы не выбираете Пол, вы выбираете пользователя. Если вы используете EAGER, коллекция genders получает инициализацию с полной коллекцией. Если вы используете LAZY, коллекция genders будет инициализирована прокси-сервером, который при необходимости будет извлекать всю коллекцию (если вы выполняете 'a.getGenders()'). Я отредактировал ответ о том, как выбрать один Пол. – chalailama

+0

хорошо, могу ли я сделать это с помощью критериев? Я не хочу делать дополнительный запрос – user3871754

 Смежные вопросы

  • Нет связанных вопросов^_^