Querydsl: Problema en la búsqueda cuando selfJoin está en consulta

Creado en 25 abr. 2019  ·  4Comentarios  ·  Fuente: querydsl/querydsl

Estoy teniendo un caso en el que me he unido en la mesa.
queryFactory
.select (queryBase.getColumns ())
.from (entityPath)
.leftJoin (QTodoEntity.todoEntity.parentLocation, QTodoEntity.todoEntity)
.leftJoin (QTodoEntity.locationEntity.country, QCountryEntity.countryEntity)
.donde (queryBase.getFilters ())
.orderBy (queryBase.getOrderBy ())
.offset (queryBase.getOffset ())
.limit (queryBase.getLimit ())
.ir a buscar()
.Arroyo()
.map (queryBase :: mapRow)
.collect (Collectors.toList ());

El alias de QTodoEntity creado en la combinación izquierda se usa en todas partes de la consulta. Si bien debería usar el alias que se creó al seleccionar desde.
La consulta se parece a

seleccione todo1.id, todo1.name, todo1.custom, todo1.selfChild de Todo todoOnSelect unión externa izquierda Todo todo1 en todoOnSelect.selfChild = todo1.id

pero la consulta debe ser -
seleccione todoOnSelect.id, todoOnSelect.name, todoOnSelect.custom, todoOnSelect.selfChild de Todo todoOnSelect unión externa izquierda Todo todo1 en todoOnSelect.selfChild = todo1.id

Comentario más útil

Prueba algo como esto:
Categoría QCategory = QCategory.category;
QCategory subCategory = new QCategory ("sub");
query.from (categoría)
.leftJoin (categoría.subcategoría, subCategoría)
.donde (category.type.equalsIgnoreCase ("A"))
.fetchCount ();

Esto le dará un alias a la subCategoría y en la cláusula where elegirá la entidad principal, no la que se unió a la izquierda.

Todos 4 comentarios

Esto no es un error.

Esto no es un error.

Como resolviste esto? Tengo el mismo problema, la cláusula where usa el alias de 'unión izquierda', en lugar del alias 'de', y los resultados son incorrectos.

Me estoy poniendo:
select count(sub.id) from category c
left join category sub on c.id = sub.id
where sub.type='A'

Debería ser:
select count(c.id) from category c
left join category sub on c.id = sub.id
where c.type='A'

Aquí está la queryDsl:
QCategory category = QCategory.category;
query.from(category)
.leftJoin(category.subcategory, QCategory.category)
.where(category.type.equalsIgnoreCase("A"))
.fetchCount();
Gracias

Prueba algo como esto:
Categoría QCategory = QCategory.category;
QCategory subCategory = new QCategory ("sub");
query.from (categoría)
.leftJoin (categoría.subcategoría, subCategoría)
.donde (category.type.equalsIgnoreCase ("A"))
.fetchCount ();

Esto le dará un alias a la subCategoría y en la cláusula where elegirá la entidad principal, no la que se unió a la izquierda.

Prueba algo como esto:
Categoría QCategory = QCategory.category;
QCategory subCategory = new QCategory ("sub");
query.from (categoría)
.leftJoin (categoría.subcategoría, subCategoría)
.donde (category.type.equalsIgnoreCase ("A"))
.fetchCount ();

Esto le dará un alias a la subCategoría y en la cláusula where elegirá la entidad principal, no la que se unió a la izquierda.

No estoy seguro de por qué funciona, pero seguro que funcionó.
¡Muchas gracias!
:)

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

devcken picture devcken  ·  6Comentarios

rafaelszp picture rafaelszp  ·  5Comentarios

okihouse picture okihouse  ·  5Comentarios

mjungsbluth picture mjungsbluth  ·  6Comentarios

robertandrewbain picture robertandrewbain  ·  5Comentarios