QueryBuilder

Status
Nicht offen für weitere Antworten.

-MacNuke-

Bekanntes Mitglied
Hmmm... das sieht mir jetzt nicht allzu viel anders aus, als direktes HQL. Wenn sowas, dann lieber Querydsl, Criteria oder JPA2 (oder ne, das lieber nicht :D)

Aber probiert habe ich es noch nicht. Das "andIfNotNull" sieht aber nett aus, weiß aber aufgrund mangelnder Doku nicht ob Querydsl sowas auch hat :D
 
Zuletzt bearbeitet:

byte

Top Contributor
Hmmm... das sieht mir jetzt nicht allzu viel anders aus, als direktes HQL. Wenn sowas, dann lieber Querydsl, Criteria oder JPA2 (oder ne, das lieber nicht :D)

Komplexe HQL Queries als Strings zusammenbauen, ist halt nicht so prickelnd, grade wenn man einen langen Where Clause hat mit optionalen Filterkriterien. Da wäre dieses andIfNotNull schon sehr praktisch. Querydsl hab ich mir noch nicht näher angeguckt, aber irgendwie schreckt mich diese Code Generation ab. Criteria ist irgendwie auch nicht das gelbe vom Ei, denn komplexe Queries (z.b. mehrere Joins/ Subselects) werden extrem unübersichtlich und schlecht wartbar.
 

timowest

Mitglied
Code generation in Querydsl ist nichts exotisches. Seit JDK 6 ist APT in javac integriert. Ausserdem geht der JPA-Standard in dieselbe Richtung.

Die "andIfNotNull"-Funktionalität von querybuilder ist ganz nett, falls ich sie richtig verstanden habe. Sie ist aber nicht so leicht in Querydsl umzusetzen.

eqIfNotNull, ltIfNotNull ... varianten zu schreiben macht keinen Sinn, und eq, lt etc sollten nicht mit null-Argumenten zu nutzen sein.

Falls jemand einen sinnvollen Querydsl-kompatiblen Syntax vorschlägt, können wir aber sowas einführen.
 

timowest

Mitglied
Hier noch eine Querydsl-Übersetzung

Java:
HibernateQueryBuilder builder = new HibernateQueryBuilder();
builder.select( "basket" );
builder.from( "BasketOrder basket" );
if( productId != null || minimumQuantity != null || category != null ){
  builder.leftJoin( "basket.details detail" );
}
//this condition will be added only if parameter is not null
builder.andIfNotNull( "detail.product.id = ?", productId );
builder.andIfNotNull( "detail.quantity <= ?", minimumQuantity );
builder.andIfNotNull( "detail.product.category.name = ?", category );
Query query = builder.build( session );
return query.list();

wird zu

Java:
QBasket basket = QBasket.basket; // Query-Variable
QOrderDetail detail = QOrderDetail.orderDetail; // Query-Variable

HQLQuery query = new HQLQueryImpl(session);
query.from(basket);
if( productId != null || minimumQuantity != null || category != null ){
    query.leftJoin(basket.details, detail);
}

if (productId != null) query.where(detail.productId.eq(productId));
if (minumQuantity != null) query.where(detail.quantity.loe(minumQuantity));
if (category != null) query.where(detail.product.category.name.eq(category));

return query.list(basket);
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben