NativeQuery

Ledig

3.1 Indledning

En anden nyttig ting, jeg gerne vil tale om, er NativeQuery . Som du allerede ved, kan du ved hjælp af NativeQuery skrive forespørgsler i native SQL. Hvad der dog er endnu mere interessant er, at du ikke behøver at bruge klassekortlægning, når du får forespørgselsresultatet.

Jeg vil hellere vise dig et eksempel:

List<Object[]> persons = session.createNativeQuery("SELECT * FROM Person").list();

I dette eksempel sender vi ikke en klasse, der matcher forespørgselsresultatrækkerne, i stedet bruger vi blot en række Object-objekter.

Dette kan være nyttigt, hvis du kun vil vælge et par kolonner i en tabel. Eksempel:

List<Object[]> persons = session.createNativeQuery("SELECT id, name FROM Person").list();

for(Object[] person : persons) {
    Number id = (Number) person[0];
    String name = (String) person[1];
}

Dette minder lidt om JDBC-tilgangen, når du får et ResultSet-objekt og læser data fra dets rækker.

Dog tilbyder Hibernate forskellige måder at gøre dette mere pålideligt. For eksempel kan du angive den type kolonner, du vil trække fra. Eksempel:

Query<Object[]> query = session.createNativeQuery("SELECT id, name FROM Person");
query.addScalar("id", StandardBasicTypes.LONG);
query.addScalar("name", StandardBasicTypes.STRING);
List<Object[]> persons = query.list();

for(Object[] person : persons) {
    Long id = (Long) person[0];
    String name = (String) person[1];
}

3.2 Entitetskortlægning

Du kan også udtrykkeligt angive den klasse, som Hibernate skal bruge, når resultatet af NativeQuery analyseres . Dette kan gøres på forskellige måder.

Query<Person> query = session.createNativeQuery("SELECT * FROM Person")
    .addEntity(Person.class);
    .list();

Og selvfølgelig det gode gamle format, du kender:

Query<Person> query = session.createNativeQuery("SELECT * FROM Person", Person.class).list();

Den første tilgang er den native Hibernate-tilgang, og den anden er den JPA-tilgang. JPA-tilgangen er mere bekvem og kortfattet, da denne standard blev opfundet efter at Hibernate eksisterede i mange år. Og Hibernate udviklede sig og blev tvunget til at understøtte gamle tilgange for at bevare kompatibiliteten med dens gamle versioner.

Forresten, takket være dens tilgang, giver Hibernate dig mulighed for at forbinde ikke én klasse til forespørgselsresultatkortlægningen, men flere klasser. Eksempel:

List<Phone> results = session.createNativeQuery(
    "SELECT {ph.*}, {pr.*}" +
    "FROM Phone ph" +
    "JOIN Person pr ON ph.person_id = pr.id")
.addEntity("ph", Phone.class)
.addJoin("pr", "ph.person")
.list();

for (Phone. phone : results) {
           	assertNotNull( phone.getPerson().getName() );
}

Denne tilgang ved hjælp af NativeQuery kan bruges til at fremskynde udvælgelsen af ​​data fra databasen. Hvis du ved, at du ikke har brug for nogle kolonner, kan du udelade dem i anmodningen.

Du kan også indlæse alle underordnede enheder på én gang, selvom Hibernate ønsker at bruge Cache eller LazyLoading -mekanismen . Derudover kan dine underordnede enheder have mange kolonner i databasen, og du kan kun vælge nogle af dem.

3.3 DTO-kortlægning

Hibernate giver dig også mulighed for at bruge ikke-Entity-klasser til at kortlægge resultatet. Klasser, der ikke har nogen anmærkninger og ikke er knyttet til nogen tabeller.

Eksempel:

public class PersonSummaryDTO {
    private Number id;
    private String name;

    public Number getId() {
    	return id;
    }

    public void setId(Number id) {
    	this.id = id;
    }

    public String getName() {
    	return name;
    }

    public void setName(String name) {
    	this.name = name;
	}
}

List<PersonSummaryDTO> dtos = session.createNativeQuery(
    "SELECT p.id as \"id\", p.name as \"name\" FROM Person p")
.setResultTransformer(Transformers.aliasToBean(PersonSummaryDTO.class) )
.list();

Da der ikke er nogen anmærkninger i klassen PersonSummaryDTO, skal navnene på kolonnerne i SQL-forespørgslen nøjagtigt svare til navnene på felterne i klassen PersonSummaryDTO.

Dette kan være meget nyttigt, hvis du læser data fra en ekstern database, som din applikation kun er tilsluttet i skrivebeskyttet tilstand. Det vil sige, du fik adgang til tabeller, der har 50+ kolonner, de gemmer data i en denormaliseret form for at fremskynde udvælgelsen.

Eller lad os sige, at nogen besluttede at gemme klassehierarkiet i én tabel, og på fem år er dette bord vokset så meget, at djævelen vil brække benet. Du skal vælge et par kolonner fra denne tabel (Id og brugernavn) og give dem til klienten.

Jeg tror du forstår, men hvis du vil dykke dybere ned i dette emne, kan du læse mere på linket:

Native SQL-forespørgsler

Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu