Sziasztok!
JPA-val még csak ismerkedem, ezért gondoltam megkérdezem tapasztaltabb fejlesztőktől, hogy a következő problémát Ők hogyan oldanák meg.
Egy lekérdezés eredménye több rekord. Az eredményül kapott rekordokra szeretnék kiadni további lekérdezéseket. Ezt natív SQL-ben VIEW használatával meg tudnám oldani. JPA-ban van olyan, hogy view? Ha nincs, akkor milyen módszerrel lehetne ezt megvalósítani?
(Elsősorban JPA-beli megoldás érdekelne, ha nincs rá lehetőség akkor Hibernate is megfelel.)
Üdv
Zidane2005
- 1736 megtekintés
Hozzászólások
Mit értesz az alatt, hogy view használata? Szeretnéd, ha egy view-ra is lenne entitásod? Vagy egyszerűen csak a view-ból akarsz lekérdezni?
--
http://www.javaforum.hu
- A hozzászóláshoz be kell jelentkezni
Inkább a második, azaz view-ból lekérdezni, de a view-t JPA-val kellene létrehozni. Tehát nem natív sql-elbe create view valami as select...
- A hozzászóláshoz be kell jelentkezni
JPA-val view-t létrehozni? Minek? Nem értem a célját. Mesélj többet a problémáról.
--
http://wiki.javaforum.hu/confluence-2.10/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
hali,
Azt irod, meg csak ismerkedsz a JPA-val. Mielott tovabbmesz, felejtsd el az sql-t, es kezdj el objektumokban gondolkodni. Az sql view-t fel lehet fogni ugy is, hogy ket(vagy tobb) objektum(tabla) valamilyen szabalyok szerinti unioja. A legtobb sql nem engedi meg a view-k update/insert/delete muveletet, persze vannak kivetelek.
A JPA-ban objektumok vannak, amiknek az alapveto update/insert/delete/select muveleteit a JPA vegzi.
Ebbe nagyon nem illik bele a view. Persze meg lehet kerulni, mint mindent, de ne szokd meg, fokent ne, ha most ismerkedsz vele.
Talan az a jobb megoldas, ha nem sql tablakat tervezel, hanem java objektumokat es elso nekifutasra ne erdekeljen, hogy az sql-ben hogy fog kinezni. Persze majd ha lesz gyakorlatod, mar figyelni fogsz erre is.
Az osszetett lekerdezest meg tudod valositani jpa-val is. Nezd meg az eclipselink dokumentaciot. Persze ez is "csak" egy objektum grafot fog eredmenyezni.
http://wiki.eclipse.org/Introduction_to_EclipseLink_Expressions_%28ELUG…
- A hozzászóláshoz be kell jelentkezni
Tegyük fel, hogy már van egy domain modell (amit nem én csináltam), erre írok olyan lekérdezést amibe van join meg pár where feltétel. Ennek az eredménye tényleg tekinthető valamilyen szabályok szerinti uniónak. Mondjuk kijön így 4000 rekord. Most jönne még n db lekérdezés, ami erre tud építeni. Mondjuk aggregációs lekérdezések más-más idő intervallum feltétellel. Adott esetben lehet tudunk olyan lekérdezéseket írni, amivel megkapjuk a végeredményt amit szeretnénk közvetlenül, de n db lekérdezés első pár lépése közös és teljesen feleslegesen join-olja össze az entitásokat minden egyes lekérdezésnél. Ezért gondoltam view-ra.
- A hozzászóláshoz be kell jelentkezni
JPA azert tud cachelest. http://java.dzone.com/articles/jpa-caching
Valamint a JPA is ugy mukodik, h az RDBMS fele kuld SQL kereseket, es az is tud cachelni.
- A hozzászóláshoz be kell jelentkezni
Es akkor mit tanacsolnal, ha lenne egy kesz adatbazisod parszazezer rekorddal (nem is olyan sok), amiben vannak olyan nezettablak, amiket hasznalni kell? Mert mondjuk csak ahhoz van hozzaferesed, es csak olvasas. Arra jelenleg tud megoldast a JPA?
- A hozzászóláshoz be kell jelentkezni
Meglévő view-ra simán tudsz entitást tenni, és úgy viselkedik, mintha valódi tábla lenne, bár nem tudsz se merge, se persis műveletet rajta.
--
http://wiki.javaforum.hu/confluence-2.10/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Szerintem én értem a problémát, megpróbálom összefoglalni, mert sokan kérdezték. (Ha nem erre gondolt a levélíró, akkor ezerrel bocs, tök feleslegesen okfejtek.)
A kolléga olyan mechanizmust szeretne, ami sok relációs alapú RAD eszközökben van. Lefuttatsz egy lekérdezést, ennek van egy eredményhalmaza (amit ne hívjunk VIEW-nak, mert félrevezető). Borland világban (Delphi, C++ Builder) ilyen a TQuery objektum, de talán a Sybase PowerBuilder DataWindow is tud hasonlót, azt nem használtam. A lényege, hogy a lekérdezés lefuttatása után kapott eredményhalmazt a memóriában tovább tudod szűkíteni extra szűrő feltételekkel (mintha az eredeti where-ben lett volna), további adatbázis lekérdezés nélkül.
Konkrétan ilyen mechanizmus a JPA-ban tudtommal nincs, de mint ahogy valaki már írta,magának a kérdésnek a megfogalmazása is relációs logikából fakad.
Megoldások:
1. Bízd a lekérdezést az adatbázis kezelőre és tuningold az adatbázist indexekkel. általában ha lefuttatsz egy selectet és utána ugyanazt többször különböző where feltételekkel, a második lekérdezés után gyors eredményt kapsz. Abba is gondolj bele, hogy ezzel a közben más tranzakciók által módosított adatokat is megkapod.
2. Fogalmazd meg a feldolgozást algoritmikus formában OO eszközökkel. Tedd az eredményhalmazt egy map-ba és az alapján keress. Használhatod a gyári vagy mások által írt Collection osztályokat, szinte mindenre van már megírt megoldás.
3. Használhatod ezt, de ez nem a JPA része:
http://josql.sourceforge.net/
Van pl. egy listád objektumopkból és azon tudsz SQL-eket lefuttatni.
"... it is merely a way of using SQL to perform data selection, grouping and ordering operations on Java objects. Java currently has no method of performing searching, sorting and grouping without writing far too much code."
List myObjs = getMyObjects ();
// Create a new Query.
Query q = new Query ();
// Parse the SQL you are going to use, it is assumed here that
// "myObjs" contains instances of "java.io.File".
q.parse ("SELECT name,length " +
"FROM java.io.File " +
"WHERE fileExtension (name) = :fileExt " +
"ORDER BY length DESC, name " +
"EXECUTE ON RESULTS avg (:_allobjs, length) avgLength");
// Set the bind variable "fileExt".
q.setVariable ("fileExt", "java");
// Execute the query.
QueryResults qr = q.execute (myObjs);
Remélem segítettem.
- A hozzászóláshoz be kell jelentkezni
Üdv,
Igen amit leírtál olyasmi mechanizmusra gondolok. Megoldási ötletek is tetszenek. Szerintem a 2. megoldás lesz egyelőre. (Viszont a 3. megoldásod is érdekes, szerintem majd megnézem azt is, még a jövőben valamikor az is jól jöhet.
A többiek is amiket írnak, azokat is mind értem és igazuk is van, de nekem most report-okhoz kellenek ezek a dolgok. Azokból nem csinálhatók entitást stb...
Köszönöm szépen mindenkinek a válaszokat és a segítségeket!
U.I.: Akinek van kérdése vagy ötlete az nyugodtan írjon még a topikba.
- A hozzászóláshoz be kell jelentkezni
sub
Szerk:Lehet futtatni nativ query-ket is jpa alól is. Szóval lehet olyan megoldás is, hogy először csinálsz magadnak egy view-t, aztán abból kérdezel - ahogy egyébként is csinálnád.
- A hozzászóláshoz be kell jelentkezni