JPA: Is er een manier om een ​​eenvoudige SELECT-instructie uit te voeren die alleen toegang heeft tot een paar kolommen?

Ik ben nieuw bij JPA, dus vergeef me als mijn vraag dwaas lijkt.

We hebben JPA gebruikt in ons project. Ik zie dat elk entiteitobject een directe toewijzing heeft met een tabel en dat elke rij in de tabel een object van dat entiteitstype is.

Maar, stel dat ik maar één of twee kolommen van een tabel wil openen, hoe kan ik het dan doen? De reden waarom ik het vraag is vanwege de taak die ik in de hand heb.

Er zijn twee tabellen. De eerste tabel heeft alles ingesteld met JPA, zodat elke rij in een objecttype kan worden gegoten. De eerste tabel heeft een kolom waarnaar wordt verwezen in de tweede tabel, dat wil zeggen, tabel A heeft kolom CLOTH_ID en tabel B heeft kolommen CLOTH_ID en CLOTH_DESCRIPTION . CLOTH_ID wordt gebruikt in zowel tabel A en B ; Maar B heeft de CLOTH_DESCRIPTION kolommen die overeenkomt met CLOTH_ID .

Ik toon tabel A in mijn webpagina maar ik moet ook: CLOTH_DESCRIPTION op mijn webpagina weergeven. Is er een JPA-georiënteerde manier om dit te doen of ben ik beter af met het gebruik van gewone JDBC om de DOEK OMSCHRIJVING -waarden te extraheren?

1

1 antwoord

Ik neem aan dat je de volgende opstelling hebt:

@Entity
@Table(name="A")
class A {

    @ManyToOne
    @JoinColumn(name="CLOTH_ID")
    private B cloth;

    //...

}

@Entity
@Table(name="B")
class B {
    @Id
    @Column(name="CLOTH_ID")
    private int id;

    @Column(name="CLOTH_DESCRIPTION")
    private String description;

    //...
}

Als je dat niet doet ... doe je het verkeerd (dat wil zeggen, het is geen idiomatisch JPA-gebruik). U hebt de volgende opties:

Simply fetch A

In dit geval wordt de relatie @ManyToOne ook standaard gretig opgehaald. Bel dan gewoon in Java:

a.getCloth().getDescription()

Geef de voorkeur aan deze benadering omdat deze de eenvoudigste en meest idiomatische is tenzij het aantal kolommen in B enorm is.

Gebruik JPA-query met aangepaste kolommen:

SELECT a, a.b.description
FROM A a
WHERE a.id = :id

In this case the query returns List, where Object[] actually contains two elements: A and String.

Hetzelfde als hierboven, maar met aangepaste DTO:

class Adto {

    private final A a;
    private final String description;

    public Adto(A a, String description) {
        this.a = a;
        this.description = description;
    }

}

En licht gewijzigde zoekopdracht:

SELECT new Adto(a, a.b.description)
FROM A a
WHERE a.id = :id
4
toegevoegd
Blij dat ik kan helpen. Overweeg een antwoord te accepteren of geef enkele informatie als u verdere hulp nodig heeft.
toegevoegd de auteur Tomasz Nurkiewicz, de bron
Waardeer je hulp :-)
toegevoegd de auteur Raam, de bron