Een slaapstandquery toewijzen aan een aangepaste klasse

1. Overzicht

Wanneer we Hibernate gebruiken om gegevens uit de database op te halen, gebruikt het standaard de opgehaalde gegevens om de hele objectgrafiek te construeren voor het aangevraagde object. Maar soms willen we misschien slechts een deel van de gegevens ophalen, bij voorkeur in een platte structuur.

In deze korte tutorial, we zullen zien hoe we dit in Hibernate kunnen bereiken met behulp van een aangepaste klasse.

2. De entiteiten

Laten we eerst eens kijken naar de entiteiten die we zullen gebruiken om de gegevens op te halen:

@Entity openbare klasse DeptEmployee {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) lange privé-id; privé String employeeNumber; private String-aanduiding; private String naam; @ManyToOne privéafdeling; // constructor, getters and setters} @Entity public class Department {@Id @GeneratedValue (strategy = GenerationType.SEQUENCE) privé lange id; private String naam; @OneToMany (mappedBy = "department") privé Lijst medewerkers; openbare afdeling (tekenreeksnaam) {this.name = naam; } // getters en setters}

Hier hebben we twee entiteiten - DeptMedewerker en afdeling. Laten we voor de eenvoud aannemen dat a DeptMedewerker kan slechts tot één behoren Afdeling.

Maar een afdeling kan meerdere hebben DeptMedewerkers.

3. Een resultaatklasse voor aangepaste zoekopdrachten

Stel dat we een lijst van alle medewerkers willen afdrukken met alleen hun naam en de naam van hun afdeling.

Meestal halen we deze gegevens op met een zoekopdracht als deze:

Queryquery = session.createQuery ("van com.baeldung.hibernate.entities.DeptEmployee"); Lijst afdEmployees = query.list ();

Hiermee worden alle medewerkers, al hun eigendommen, de bijbehorende afdeling en al zijn eigendommen opgehaald.

Maar in dit specifieke geval dit is misschien wat duur omdat we alleen de naam van de medewerker en de naam van de afdeling nodig hebben.

Een manier om alleen de informatie op te halen die we nodig hebben, is door de eigenschappen op te geven in de select-clausule.

Maar wanneer we dit doen, retourneert Hibernate een lijst met arrays in plaats van een lijst met Voorwerpen:

Queryquery = session.createQuery ("selecteer m.name, m.department.name van com.baeldung.hibernate.entities.DeptEmployee m"); Lijstbeheerders = query.list (); Object [] manager = (Object []) managers.get (0); assertEquals ("John Smith", manager [0]); assertEquals ("Verkoop", manager [1]);

Zoals we kunnen zien, zijn de geretourneerde gegevens een beetje omslachtig om te verwerken. Maar gelukkig kunnen we Hibernate ertoe brengen om deze gegevens in een klasse te vullen.

Laten we eens kijken naar de Resultaat klasse die we zullen gebruiken om de opgehaalde gegevens in te vullen in:

public class Resultaat {private String employeeName; private String departmentName; openbaar resultaat (String employeeName, String departmentName) {this.employeeName = employeeName; this.departmentName = departmentName; } public Result () {} // getters en setters}

Merk op dat de klasse geen entiteit is, maar slechts een POJO. We kunnen echter ook een entiteit gebruiken zolang deze een constructor heeft die alle attributen accepteert die we als parameters willen invullen.

In de volgende sectie zullen we zien waarom de constructor belangrijk is.

4. Met behulp van een constructor in HQL

Laten we nu eens kijken naar de HQL die deze klasse gebruikt:

Queryquery = session.createQuery ("selecteer nieuw com.baeldung.hibernate.pojo.Result (m.name, m.department.name)" + "van com.baeldung.hibernate.entities.DeptEmployee m"); Lijstresultaten = query.list (); Resultaat resultaat = results.get (0); assertEquals ("John Smith", result.getEmployeeName ()); assertEquals ("Verkoop", result.getDepartmentName ());

Hier gebruiken we de constructor die we hebben gedefinieerd in het Resultaat class samen met de eigenschappen die we willen ophalen. Dit geeft een lijst met Resultaat objecten met de gegevens die uit de kolommen zijn ingevuld.

Zoals we kunnen zien, is de geretourneerde lijst gemakkelijker te verwerken dan een lijst met objectmatrices te gebruiken.

Het is belangrijk op te merken dat we de volledig gekwalificeerde naam van de klasse in de query moeten gebruiken.

5. Met behulp van een ResultTransformer

Een alternatief voor het gebruik van een constructor in de HQL-query is om een Resultaat Transformator:

Queryquery = session.createQuery ("selecteer m.name als employeeName, m.department.name als departmentName" + "van com.baeldung.hibernate.entities.DeptEmployee m"); query.setResultTransformer (Transformers.aliasToBean (Result.class)); Lijstresultaten = query.list (); Resultaat resultaat = results.get (0); assertEquals ("John Smith", result.getEmployeeName ()); assertEquals ("Verkoop", result.getDepartmentName ());

Wij gebruiken de Transformatoren.aliasToBean () methode om de opgehaalde gegevens te gebruiken om het Resultaat voorwerpen.

Daarom moeten we ervoor zorgen dat de kolomnamen of hun aliassen in de select-instructie overeenkomen met de eigenschappen van het Resultaat klasse.

Let daar op Query.setResultTransformer (Resultaat Transformer) is verouderd sinds Hibernate 5.2.

6. Conclusie

In dit artikel hebben we gezien hoe een aangepaste klasse kan worden gebruikt om gegevens op te halen in een vorm die gemakkelijk te lezen is.

De broncode die bij dit artikel hoort, is beschikbaar op GitHub.