Querydsl: Problem beim Abrufen, wenn selfJoin in der Abfrage ist

Erstellt am 25. Apr. 2019  ·  4Kommentare  ·  Quelle: querydsl/querydsl

Ich habe einen Fall, in dem ich mich selbst in die Tabelle einfüge.
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())
.bringen()
.Strom()
.map(queryBase::mapRow)
.collect(Collectors.toList());

Der Alias ​​der beim linken Join erstellten QTodoEntity wird überall in der Abfrage verwendet. Es sollte jedoch den Alias ​​verwenden, der bei der Auswahl erstellt wurde.
Abfrage sieht so aus

select todo1.id, todo1.name, todo1.custom, todo1.selfChild von Todo todoOnSelect linker äußerer Join Todo todo1 auf todoOnSelect.selfChild=todo1.id

aber Abfrage sollte sein -
select todoOnSelect.id, todoOnSelect.name, todoOnSelect.custom, todoOnSelect.selfChild von Todo todoOnSelect linker äußerer Join Todo todo1 auf todoOnSelect.selfChild=todo1.id

Hilfreichster Kommentar

Versuchen Sie so etwas -
QCategory-Kategorie = QCategory.category;
QCategory subCategory = new QCategory("sub");
query.from(Kategorie)
.leftJoin(category.subcategory, subcategory)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();

Dadurch wird subCategory ein Alias ​​zugewiesen, und in der WHERE-Klausel wird die Hauptentität ausgewählt, nicht die links verbundene.

Alle 4 Kommentare

Dies ist kein Fehler.

Dies ist kein Fehler.

Wie haben Sie das gelöst? Ich habe das gleiche Problem, die where-Klausel verwendet den Alias ​​"left Join" anstelle des Alias ​​"from", und die Ergebnisse sind falsch.

Ich erhalte:
select count(sub.id) from category c
left join category sub on c.id = sub.id
where sub.type='A'

Es sollte sein:
select count(c.id) from category c
left join category sub on c.id = sub.id
where c.type='A'

Hier ist die queryDsl:
QCategory category = QCategory.category;
query.from(category)
.leftJoin(category.subcategory, QCategory.category)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();
Vielen Dank

Versuchen Sie so etwas -
QCategory-Kategorie = QCategory.category;
QCategory subCategory = new QCategory("sub");
query.from(Kategorie)
.leftJoin(category.subcategory, subcategory)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();

Dadurch wird subCategory ein Alias ​​zugewiesen, und in der WHERE-Klausel wird die Hauptentität ausgewählt, nicht die links verbundene.

Versuchen Sie so etwas -
QCategory-Kategorie = QCategory.category;
QCategory subCategory = new QCategory("sub");
query.from(Kategorie)
.leftJoin(category.subcategory, subcategory)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();

Dadurch wird subCategory ein Alias ​​zugewiesen, und in der WHERE-Klausel wird die Hauptentität ausgewählt, nicht die links verbundene.

Nicht sicher, warum es funktioniert, aber es hat auf jeden Fall den Zweck erfüllt.
Ich danke dir sehr!
:)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen