Skip to content
App Stretch
  • Home
  • / Articles
  • /
  • címke: SqlResultSetMapping

címke: SqlResultSetMapping

március 4, 2022Articles

a szépség a szemlélő szemében rejlik. Tehát nem “könnyű”:

Tudjon meg többet az SQL eredményhalmaz-Leképezésekről és kezelje könnyedén a natív lekérdezés eredményeit: http://t.co/WH4BTlClIP #JPA # Java # JavaEE

Thorben nagyon jó és hasznos cikkeket ír a JPA – ról, és nemrégiben egy kiváló sorozatot indított a JPA 2.1 új funkcióiról. Amelyek között: eredményhalmaz-leképezés. Lehet, hogy ismeri az eredményhalmaz leképezését olyan webhelyekről, mint a CTMMC, vagy annotatiomania.com. ezt a leképezési eljárást a következőképpen foglalhatjuk össze:

a) határozza meg a leképezést

@SqlResultSetMapping( name = "BookAuthorMapping", entities = { @EntityResult( entityClass = Book.class, fields = { @FieldResult(name = "id", column = "id"), @FieldResult(name = "title", column = "title"), @FieldResult(name = "author", column = "author_id"), @FieldResult(name = "version", column = "version")}), @EntityResult( entityClass = Author.class, fields = { @FieldResult(name = "id", column = "authorId"), @FieldResult(name = "firstName", column = "firstName"), @FieldResult(name = "lastName", column = "lastName"), @FieldResult(name = "version", column = "authorVersion")})})

a fenti leképezés meglehetősen egyenes. Meghatározza, hogy az adatbázis-oszlopokat hogyan kell leképezni az entitásmezőkre és az entitások egészére. Ezután nevet ad ennek a leképezésnek ("BookAuthorMapping"), amelyet aztán újra felhasználhat az alkalmazásban, például natív JPA lekérdezésekkel.

kifejezetten szeretem azt a tényt, hogy Thorben akkor írja:

ha nem szeretne ilyen hatalmas annotációs blokkot hozzáadni az entitáshoz, akkor a leképezést XML fájlban is meghatározhatja

… így, visszatértünk a hatalmas annotációs blokkok helyettesítésére hatalmas XML-blokkokkal – ez a technika, amelyet sokan el akartunk kerülni a kommentárok használatával… :- )

b) alkalmazza a leképezést

miután a leképezést statikusan meghatározták valamilyen Java típuson, a fentiek alkalmazásával lekérheti ezeket az entitásokat BookAuthorMapping

List<Object> results = this.em.createNativeQuery( "SELECT b.id, b.title, b.author_id, b.version, " + " a.id as authorId, a.firstName, a.lastName, " + " a.version as authorVersion " + "FROM Book b " + "JOIN Author a ON b.author_id = a.id", "BookAuthorMapping").getResultList();results.stream().forEach((record) -> { Book book = (Book)record; Author author = (Author)record;});

figyeld meg, hogyan kell még emlékezni a Book és Author típusokra, és a cast-et kifejezetten, mivel nincs ellenőrizhető típusú információ, ami valóban csatolva lenne bármihez.

a “komplex”meghatározása

most a cikk azt állítja, hogy ez “komplex” feltérképezés, és kétségtelenül egyetértek. Ez a nagyon egyszerű lekérdezés, csak egy egyszerű csatlakozással, már ilyen annotációs rendetlenséget vált ki, ha valóban meg akarja térképezni az entitásokat a JPA-n keresztül. Nem akarja látni Thorben leképezési kommentárjait, ha a lekérdezések kissé összetettebbé válnak. És ne feledd, @SqlResultSetMapping a térképezésről szól (natív!) SQL eredmények, tehát már nem az objektum-gráf-perzisztencia földön vagyunk, hanem az SQL földön, ahol a tömeges Lekérés, denormalizálás, összesítés és más “divatos” SQL dolgok a király.

a probléma itt van:

a Java 5 annotációkat vezetett be. A kommentárokat eredetileg “mesterséges módosítóként” szánták, azaz olyan dolgok, mint static, final, protected (érdekes módon Ceylon csak kommentárokat ismer, módosítókat nem). Ennek van értelme. A Java nyelvtervezők új módosítókat / “kulcsszavakat” vezethetnek be a meglévő kód feltörése nélkül – mert a “valódi” kulcsszavak fenntartott szavak, amelyeket nehéz bevezetni egy nyelven. Emlékszel enum?

tehát a kommentárok jó Felhasználási esetei (és csak kevés) vannak:

  • @Override
  • @Deprecated (habár, egy megjegyzés attribútum divatos lett volna)
  • @FunctionalInterface

a JPA (és más Java EE API-k, valamint a Spring) teljesen megőrültek az annotációk használatában. Ismételje meg utánam:

Nincs nyelv @Before vagy @After Java valaha visszaélt kommentárok, mint Java  tweet ezt

(a @Before / @ After ötlet lennoffé volt, a reddit-en)

a fentieket olvasva erős d ++ j Vu van bennem. Emlékszel a következőkre?

Nincs nyelv előtt vagy után Java valaha visszaélni ellenőrzött kivételek, mint Java

mindannyian mélyen megbánni Java annotations 2020-ig.

a kommentárok egy nagy szemölcs a Java típusú rendszerben. Rendkívül korlátozott indokolt felhasználásuk van, és amit mi, Java vállalati fejlesztők manapság csinálunk, egyáltalán nem az “indokolt”határain belül van. Visszaélünk velük olyan dolgok konfigurálása miatt, amelyekre valóban kódot kellene írnunk.

így futtathatja ugyanazt a lekérdezést a jOOQ – val (vagy bármely más API-val, amely generikus és típusbiztonságot használ az SQL számára):

Book b = BOOK.as("b");Author a = AUTHOR.as("a");DSL.using(configuration) .select(b.ID, b.TITLE, b.AUTHOR_ID, b.VERSION, a.ID, a.FIRST_NAME, a.LAST_NAME, a.VERSION) .from(b) .join(a).on(b.AUTHOR_ID.eq(a.ID)) .fetch() .forEach(record -> { BookRecord book = record.into(b); AuthorRecord author = record.into(a); });

ez a példa egyesíti mind a JPA 2.1 megjegyzéseit, mind a lekérdezéseket. A kivetített “entitásokra” vonatkozó összes metainformáció már szerepel a lekérdezésben, tehát a Result – ban, amelyet a fetch() módszerrel állítanak elő. De ez nem igazán számít, a lényeg itt az, hogy ez a lambda kifejezés …

record -> { BookRecord book = record.into(b); AuthorRecord author = record.into(a);}

… bármi lehet, amit akarsz! Mint a kifinomultabb példák, amelyeket az előző blogbejegyzésekben bemutattunk:

  • nincs több szükség ORMs
  • Alakítsa át az SQL adatok diagramok segítségével jOOQ és JavaFX

Mapping lehet meghatározni ad-hoc, menet közben, a funkciók használatával. A függvények az ideális leképezők, mert vesznek egy bemenetet, kimenetet hoznak létre, és teljesen hontalanok. És a legjobb dolog a Java 8 függvényeiben az, hogy a Java fordító fordítja őket, és felhasználhatók a leképezés típusellenőrzésére. Az objektumokhoz funkciókat is hozzárendelhet, amelyek lehetővé teszik a funkciók újrafelhasználását, ha egy adott leképezési algoritmus többször is használható.

valójában maga az SQL SELECT záradék is ilyen függvény. Olyan függvény, amely a bemeneti sorokat / sorokat kimeneti sorokká / sorokká alakítja, és ezt a függvényt menet közben adaptálhatja további kifejezésekkel.

az előző JPA 2.1 natív SQL utasításban és a @SqlResultSetMapping példában semmi sem ellenőrizhető. Képzelje el, hogy megváltoztatja az oszlop nevét:

List<Object> results = this.em.createNativeQuery( "SELECT b.id, b.title as book_title, " + " b.author_id, b.version, " + " a.id as authorId, a.firstName, a.lastName, " + " a.version as authorVersion " + "FROM Book b " + "JOIN Author a ON b.author_id = a.id", "BookAuthorMapping").getResultList();

észrevetted a különbséget? A b.titleoszlopot átnevezték book_title – re. Egy SQL karakterláncban. Ami futási időben felrobban! Hogyan lehet emlékezni arra, hogy alkalmazkodnia kell

@FieldResult(name = "title", column = "title")

… ahhoz, hogy

@FieldResult(name = "title", column = "book_title")

ezzel szemben, hogyan kell emlékezni, hogy ha átnevezi a column a @FieldResult, akkor is meg kell nézni, ahol ez a "BookAuthorMapping" használják, valamint módosítsa az oszlop nevét azokban a lekérdezésekben.

@SqlResultSetMapping( name = "BookAuthorMapping", ...)

a kommentárok gonoszak

lehet, hogy nem ért egyet a fentiekkel. Lehet, hogy nem tetszik a jOOQ a JPA alternatívájaként, ez teljesen rendben van. De nagyon nehéz nem egyetérteni azzal a ténnyel, hogy:

  • Java 5 bevezetett nagyon hasznos kommentárok
  • Java EE / Spring erősen visszaélt e kommentárok helyett XML
  • most már van egy párhuzamos univerzum típusú rendszer Java
  • ez a párhuzamos univerzum típusú rendszer teljesen haszontalan, mert a fordító nem tud önvizsgálatra ez
  • Java SE 8 bevezeti a funkcionális programozás és sok típusú következtetés
  • Java SE 9-10 fog bevezetni több félelmetes nyelvi funkciók
  • most már világossá válik, hogy mi volt konfiguráció (XML vagy kommentárok) kellett volna kódot az első helyen
  • JPA 2.1 lett az új EJB 2.0: elavult

mint mondtam. Nehéz nem érteni egyet. Vagy más szavakkal:

a kód sokkal jobban kifejezi az algoritmusokat, mint a konfiguráció  tweet ezt

személyesen találkoztam Thorben-nel számos alkalommal konferenciákon. Ez a henceg itt nem azt jelentette, személyesen, Thorben: -) a cikkek a JPA nagyon érdekes. Ha a cikk olvasói JPA-t használnak, kérjük, nézze meg Thorben blogját: http://www.thoughts-on-java.org.

időközben szeretném kinevezni Thorben-t az “év Annotatiomaniac 2015”

Write a Reply or Comment Kilépés a válaszból

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Legutóbbi bejegyzések

  • automatikus üveg és szélvédő csere Tempe-ben
  • Stu Shea, 2020 Wash100 győztes, Megjegyzések Peraton COVID-19 Segélyezési erőfeszítéseiről
  • Az a lány blogja: jegyzetelés kézzel
  • Mi a teendő, ha a válásra gondolunk
  • a 3 dolláros kereskedő Joe fagyasztó folyosója keresse meg a gyerekeimet folyamatosan könyörögni, hogy készítsek
  • Deutsch
  • Nederlands
  • Svenska
  • Norsk
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
  • 한국어

Archívum

  • 2022 március
  • 2022 február
  • 2022 január
  • 2021 december

Copyright App Stretch 2022 | Theme by ThemeinProgress | Proudly powered by WordPress