Querydsl: Problème d'extraction lorsque selfJoin est en requête

Créé le 25 avr. 2019  ·  4Commentaires  ·  Source: querydsl/querydsl

J'ai un cas où j'ai une auto-jointure dans la table.
usine de requête
.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())
.aller chercher()
.flux()
.map(queryBase::mapRow)
.collect(Collectors.toList());

L'alias de la QTodoEntity créé sur la jointure gauche est utilisé partout dans la requête. Alors qu'il devrait utiliser l'alias qui a été créé lors de la sélection.
La requête ressemble à

sélectionnez todo1.id, todo1.name, todo1.custom, todo1.selfChild de Todo todoOnSelect jointure externe gauche Todo todo1 sur todoOnSelect.selfChild=todo1.id

mais la requête devrait être -
sélectionnez todoOnSelect.id, todoOnSelect.name, todoOnSelect.custom, todoOnSelect.selfChild de Todo todoOnSelect jointure externe gauche Todo todo1 sur todoOnSelect.selfChild=todo1.id

Commentaire le plus utile

Essayez quelque chose comme ça -
Catégorie QCategory = QCategory.category ;
QCategory subCategory = new QCategory("sous");
requête.de(catégorie)
.leftJoin(category.subcategory, subCategory)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();

Cela donnera un alias à subCategory et dans la clause where, il choisira l'entité principale, pas celle jointe à gauche.

Tous les 4 commentaires

Ce n'est pas un bug.

Ce n'est pas un bug.

Comment avez-vous résolu cela ? J'ai le même problème, la clause where utilise l'alias 'left join', au lieu de l'alias 'from', et les résultats sont incorrects.

Je suis en train:
select count(sub.id) from category c
left join category sub on c.id = sub.id
where sub.type='A'

Ça devrait être:
select count(c.id) from category c
left join category sub on c.id = sub.id
where c.type='A'

Voici le queryDsl :
QCategory category = QCategory.category;
query.from(category)
.leftJoin(category.subcategory, QCategory.category)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();
Merci

Essayez quelque chose comme ça -
Catégorie QCategory = QCategory.category ;
QCategory subCategory = new QCategory("sous");
requête.de(catégorie)
.leftJoin(category.subcategory, subCategory)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();

Cela donnera un alias à subCategory et dans la clause where, il choisira l'entité principale, pas celle jointe à gauche.

Essayez quelque chose comme ça -
Catégorie QCategory = QCategory.category ;
QCategory subCategory = new QCategory("sous");
requête.de(catégorie)
.leftJoin(category.subcategory, subCategory)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();

Cela donnera un alias à subCategory et dans la clause where, il choisira l'entité principale, pas celle jointe à gauche.

Je ne sais pas pourquoi cela fonctionne, mais cela a certainement fait l'affaire.
Merci beaucoup!
:)

Cette page vous a été utile?
0 / 5 - 0 notes