9 Stimmen

Wie erstelle ich ein GenericDao mit QueryDSL?

Zunächst einmal bin ich wirklich neu bei QueryDSL.

Ich verwende eine Spring + Hibernate Umgebung.

Das Problem, dem ich gegenüberstehe, besteht darin, dass ich ein GenericDAO erstellen muss, um alle grundlegenden CRUD-Operationen zu implementieren, aber ich bin mir nicht sicher, wie ich die statische Referenz von einer QEntity erhalten soll.

Die Struktur meiner Entitätsklasse sieht so aus:

    @Entity //jpa
    public class Entity extends AbstractEntity{
    //Felder
    ...
    }

    public abstract class AbstractEntity{
    //Logger 
    }

Die grundlegende Struktur einer von QueryDSL generierten Entität:

    public class QEntity extends PEntity{
    ...
    public static final QEntity entity = new QEntity("entity");        
    ...
    //Konstruktoren

    } 

Und das GenericDao würde so aussehen:

    public class abstract GenericDao>{

    //irgendeine Art von Methode, um die K.k (QEntity.entity) Referenz zu erhalten.        
    //CRUD-Operationen, die T und K verwenden

    }

Ein Ansatz wäre die Verwendung von Reflection, aber ich bin kein Verfechter dieser Methode, insbesondere in diesem Fall.

Eine weitere Sache, über die ich mir nicht sicher bin, ist, ob es obligatorisch ist, die statische Referenz von einer QEntity zu verwenden, um Abfragen zu erstellen, oder ob es in Ordnung ist, wenn ich einen Konstruktoraufruf verwende, um ein neues Objekt zu erhalten. Außerdem, was bedeutet der String im Konstruktorparameter?

    public QEntity(String variable) {
    this(Entity.class, forVariable(variable), INITS);
    }

8voto

Timo Westkämper Punkte 21086

Das Problem, mit dem ich konfrontiert bin, besteht darin, einen GenericDAO zu erstellen, um alle grundlegenden CRUD-Operationen zu implementieren, aber ich bin mir nicht sicher, wie ich die statische Referenz von einer QEntity erhalten soll.

Ohne eine Referenz auf die QEntity-Klasse ist es schwierig, also stellen Sie sicher, dass Sie eine Instanz davon an Ihr DAO übergeben.

Ein weiteres, worüber ich mir nicht sicher bin, ist, ob es zwingend erforderlich ist, die statische Referenz von einer QEntity zu verwenden, um Abfragen zu erstellen, oder ob es in Ordnung ist, wenn ich einen Konstruktoraufruf mache, um ein neues Objekt zu erhalten. Auch, was bedeutet der String im Konstruktorparameter?

Nein, es ist nicht zwingend erforderlich, es ist eine Bequemlichkeitsinstanz. Das Argument des Konstruktors ist der Variablennamen. Wenn Sie eine benutzerdefinierte Instanz bereitstellen, stellen Sie sicher, dass Sie den gleichen Variablennamen konsistent verwenden.

Stellen Sie auch sicher, dass Sie die neueste Querydsl-Version verwenden. PEntity sieht aus wie eine Klasse vor Version 2.0.

Hier ist ein Beispiel für eine generische DAO-Superklasse für die Verwendung von Querydsl JPA https://github.com/querydsl/querydsl/blob/master/querydsl-examples/querydsl-example-jpa-guice/src/main/java/com/querydsl/example/jpa/repository/AbstractRepository.java

Aktualisierung

Wenn Sie vermeiden möchten, den Q-Typ an Ihre DAO-Klasse zu übergeben, können Sie ein Muster wie dieses verwenden https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/support/QueryDslRepositorySupport.java#L54

Der Variablenname wird der einfache Name Ihrer Entitätsklasse sein, wobei der erste Buchstabe in Kleinbuchstaben konvertiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X