Querydsl: Проблема с получением, когда selfJoin находится в запросе

Созданный на 25 апр. 2019  ·  4Комментарии  ·  Источник: querydsl/querydsl

У меня случай, когда я сам присоединяюсь к столу.
queryFactory
.select (queryBase.getColumns ())
.from (entityPath)
.leftJoin (QTodoEntity.todoEntity.parentLocation, QTodoEntity.todoEntity)
.leftJoin (QTodoEntity.locationEntity.country, QCountryEntity.countryEntity)
.where (queryBase.getFilters ())
.orderBy (queryBase.getOrderBy ())
.offset (queryBase.getOffset ())
.limit (queryBase.getLimit ())
.принести()
.транслировать()
.map (queryBase :: mapRow)
.collect (Collectors.toList ());

Псевдоним QTodoEntity, созданного при левом соединении, используется везде в запросе. Хотя он должен использовать псевдоним, который был создан при выборе из.
Запрос выглядит как

выберите todo1.id, todo1.name, todo1.custom, todo1.selfChild из Todo todoOnSelect левое внешнее соединение Todo todo1 на todoOnSelect.selfChild = todo1.id

но запрос должен быть -
выберите todoOnSelect.id, todoOnSelect.name, todoOnSelect.custom, todoOnSelect.selfChild из Todo todoOnSelect левое внешнее соединение Todo todo1 на todoOnSelect.selfChild = todo1.id

Самый полезный комментарий

Попробуйте что-то вроде этого -
QCategory category = QCategory.category;
QCategory subCategory = новая QCategory ("под");
query.from (категория)
.leftJoin (категория.подкатегория, подкатегория)
.where (category.type.equalsIgnoreCase ("A"))
.fetchCount ();

Это даст псевдоним subCategory, и в предложении where будет выбрана основная сущность, а не присоединенная слева.

Все 4 Комментарий

Это не ошибка.

Это не ошибка.

Как вы это решили? У меня та же проблема, в предложении where используется псевдоним «left join» вместо псевдонима from, и результаты неверны.

Я получаю:
select count(sub.id) from category c
left join category sub on c.id = sub.id
where sub.type='A'

Должен быть:
select count(c.id) from category c
left join category sub on c.id = sub.id
where c.type='A'

Вот queryDsl:
QCategory category = QCategory.category;
query.from(category)
.leftJoin(category.subcategory, QCategory.category)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();
Спасибо

Попробуйте что-то вроде этого -
QCategory category = QCategory.category;
QCategory subCategory = новая QCategory ("под");
query.from (категория)
.leftJoin (категория.подкатегория, подкатегория)
.where (category.type.equalsIgnoreCase ("A"))
.fetchCount ();

Это даст псевдоним subCategory, и в предложении where будет выбрана основная сущность, а не присоединенная слева.

Попробуйте что-то вроде этого -
QCategory category = QCategory.category;
QCategory subCategory = новая QCategory ("под");
query.from (категория)
.leftJoin (категория.подкатегория, подкатегория)
.where (category.type.equalsIgnoreCase ("A"))
.fetchCount ();

Это даст псевдоним subCategory, и в предложении where будет выбрана основная сущность, а не присоединенная слева.

Не уверен, почему это работает, но это определенно помогло.
Большое спасибо!
:)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги