Hibernate -> SQL verwenden und keine Entity

PHANTOMIAS

Aktives Mitglied
Hallo an alle!

Ich habe ein Problem: Ich nutze Hibernate und habe normalerweise ein Objekt das annotiert ist, bspw. ein Address-Objekt.
Bei diesem sage ich dann über die Schnittstelle
Java:
public List<Address> getAllAddresses();
Und bekomme dann eine Liste an Adress-Objekten zurück.

In der DAO-Implementierung tue ich nämlich:
Java:
public List<Address> getAllAddresses() {
	SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
	Session sess = sessionFactory.getCurrentSession();
	Transaction tx = sess.beginTransaction();
	@SuppressWarnings("unchecked")
	List<Address> addresses= sess.createQuery("from Address").list();
	tx.commit();
	return addresses;
}
Das war bisher mein normaler Weg.

Nun aber zu meinem Problem: Ich muss eine selbstgeschriebene SQL-Abfrage an die Datenbank weitergeben und es liefert mir etwas zurück, das sich aus mehreren Tabellen berechnet. Über die Objekte das zu managen, wäre viel zu umständlich, da müsste ich mir fast die ganze Datenbank erst in Objekte einlesen um darüber dann das zusammenzubauen was mit SQL in 7-8 Zeilen geht.

Zurückbekommen tue ich so etwas:
Code:
TAG            DAUER
23.01.2010        31
24.01.2010        18
25.01.2010        20
26.01.2010        27
Das mapped aber auf kein Objekt, sondern die Klasse müsste ich dann anlegen:
Java:
class TagDauer {
 ... Eigenschaften TAG und DAUER ... setter/getter
}
Ich rufe den Service über eine Flex-Anwendung auf, dann würde ich auf der Frontend-Seite auch diese Klasse bauen, dass die dann miteinander "vernetzt" sind.

Aber geht das so überhaupt? Wie setzt man so etwas um?

Danke vielmals im voraus für eure Hilfe, Gruss PHANTOMIAS
 
M

Marcinek

Gast
this.openSession().createSQLQuery(arg0, arg1, arg2)

Damit kann man einen nativen SQL mit Order und dann noch die Klasse angeben, in das die Werte aus dem Query reingemappt werden sollen.
 

PHANTOMIAS

Aktives Mitglied
Ich habe es so gemacht:
Java:
public List<Chart> getAllCharts() {
	SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
	Session sess = sessionFactory.getCurrentSession();
	Transaction tx = sess.beginTransaction();
	@SuppressWarnings("unchecked")
	List<Chart> charts = (List<Chart>) sess.createSQLQuery("select ...").addEntity(Chart.class).list();
	tx.commit();
	return charts;
}
Nun erhalte ich jedoch den Fehler:
org.hibernate.MappingException : Unknown entity: com.myDomain.myProject.data.domain.Chart

Lasse ich das "addEntity(Chart.class)", so kommt es über den Tomcat zum Frontend zwar von den Werten her an, es ist aber keine Klasse "Chart".

An was kann das liegen, dass ich diese Meldung erhalte? Wie bereits erwähnt, annotiert ist diese Klasse nicht.

Gruss PHANTOMIAS

Update: Das Problem ist wohl, dass Chart.class nicht mit @Entity annotiert ist?!
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> An was kann das liegen, dass ich diese Meldung erhalte? Wie bereits erwähnt, annotiert ist diese Klasse nicht.

du stellst die Frage, du lieferst die Antwort, genau daran liegt es, Entity ist auch ein Fachbegriff in Hibernate

wie in meinem Link schon aufgeführt geht stattdessen
"select new com.myDomain.myProject.data.domain.Chart(x,y,z) from .. ";
sofern ein passender Konstruktor vorhanden ist,
mit HQL geht das in jedem Fall, da dürfte die Query auch sauberer zu formulieren sein, SQL geht bestimmt genauso
 

PHANTOMIAS

Aktives Mitglied
Ich habe es umgesetzt, jetzt erhalte ich jedoch:
org.hibernate.exception.SQLGrammarException : could not execute query
SQL:
List<Chart> charts = sess.createSQLQuery(
	"select new com.myDomain.myProject.data.domain.Chart ('2010-07-06' AS 'd', sum(DUR) AS 'r', 0 AS 'o') " +
	" from " +
	" (select distinct a.id as ID, a.dur as DUR from b_c" +
	" inner join c on b_c.c_id = c.id " +
	" inner join a on c.id = a.c_id " +
	" inner join a_aud on a.id = a_aud.id " +
	" inner join d on a_aud.rev = d.rev " +
	" where b_c.b_id = 30 and " +
	" a_aud.stat != 1 and " +
	" DATE(FROM_UNIXTIME(revtime / 1000)) = DATE('2010-07-06')) " +
	" AS SubSelectTable").list();
Was stimmt an dieser Abfrage nicht? Führe ich sie auf der Konsole aus, geht sie, wbei ich tendiere zu sagen, dass es an den AS als Parameter liegen könnte? Nur ohne die AS funktioniert das Subselect nicht.

Gruss PHANTOMIAS
 
S

SlaterB

Gast
'could not execute query' sollte immer noch eine dahinerliegende Exception haben, die genauer erklärt was los ist,
fängst du die Exception ab? dann schau nach getCause()

jetzt wo ich das SQL sehe, glaube ich wieder weniger, dass
'select new com.myDomain.myProject.data.domain.Chart' funktioniert,
aber fast zu einfach um es hinzuschreiben: einfach testen..

wieso eigentlich AS 'd' usw. im select, das macht doch keinen Unterschied?
meinst du die oder AS SubSelectTable mit 'Nur ohne die AS funktioniert das Subselect nicht.'?

das wahrscheinlichste und bei mir der häufigste Fehler ist ein falscher Konstruktor, nicht passende Parametertypen,
versuche erstmal nur die Attribute abzufragen ohne Rahmenklasse, schau dir an was da rauskommt (String statt Date usw.),
danach eins nach dem anderen im Konstruktor, gerne auch mal nur mit Object als Parameter
 

PHANTOMIAS

Aktives Mitglied
Debugge ich auf Serverseite, erhalte ich:
SCHWERWIEGEND: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.myDomain.myProject.data.domain.Chart ('2010-07-06' AS 'd', sum(DUR)' at line 1

Lasse ich die AS im select weg, geht es auch, aber gleiche Fehlermeldung.

Und auch alle anderen Modifikationen funktionieren nicht!

Auch so eine einfache Abfrage klappt nicht, es wird der gleiche Fehler wie oben geworfen. Also klappt da grundlegend das Konstrukt nicht?! Weil ein einfachere Abfrage geht ja fast nicht mehr :)
SQL:
public List<Chart> getAllCharts() {
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    Session sess = sessionFactory.getCurrentSession();
    Transaction tx = sess.beginTransaction();
    @SuppressWarnings("unchecked")
    List<Chart> charts = sess.createSQLQuery("select new com.myDomain.myProject.data.domain.Chart(myTable.id) from myTable where testColumn = 10").list();
    tx.commit();
    return charts;
}

Gruss PHANTOMIAS
 
M

Marcinek

Gast
Mir erscheint das sehr logisch.

Das, was da in der SQL steht ist kein HQL!

Daher wird das Statement so auf der DB abgelegt und daher kann ich mir nicht vorerstellen, dass er mit einem statement: select "NEW BBLA BLA (hier kommt die id)" überhaupt was anfangen kann.

Wenn es mysql ist dann kann ich dir sagen, dass das so nicht klappt.
 

PHANTOMIAS

Aktives Mitglied
Okay, also meine Abfrage in HQL umwandeln, dann klappt es?

Kann ich weiterhin meine Methode so verwenden und das schreiben:
Java:
List<Chart> charts = sess.createSQLQuery(ALLES_IN_HQL).list();

Danke + Gruß PHANTOMIAS
 
M

Marcinek

Gast
Eher nicht.

Hier muss ein gültiges SQL rein.

Bei deinen letzten Versuchen vermisse ich ein wenig das VO, in das er mappen soll.

Wie wäre es, wenn du aus deiner Anfrage eine View baust und diese normal über Hibernate mappst?

Gruß,

Marcinek
 

PHANTOMIAS

Aktives Mitglied
Mein VO ist die Chart-Klasse.
Das ist ja nur das Backend! Die Frontend-Anbindung ist auf Flex-Seite und nicht auf der Java-Seite, deswegen weiß ich nicht was du meinst, dass du ein wenig das VO vermisst in dem es mappen soll.

Was meinst du mit View bauen und dann normal über Hibernate mappen? Ich habe ja keine Entity-Entsprechung in einer Datenbanktabelle.
Und wie man das sinnvoll macht, das habe ich hier ja angefragt :)

Danke und Gruß PHANTOMIAS
 
M

Marcinek

Gast
Also was ich mit view meine:

In der Datenbank: Create View blabla as
"select new com.myDomain.myProject.data.domain.Chart ('2010-07-06' AS 'd', sum(DUR) AS 'r', 0 AS 'o') " +
" from " +
" (select distinct a.id as ID, a.dur as DUR from b_c" +
" inner join c on b_c.c_id = c.id " +
" inner join a on c.id = a.c_id " +
" inner join a_aud on a.id = a_aud.id " +
" inner join d on a_aud.rev = d.rev " +
" where b_c.b_id = 30 and " +
" a_aud.stat != 1 and " +
" DATE(FROM_UNIXTIME(revtime / 1000)) = DATE('2010-07-06')) " +
" AS SubSelectTable"

Anschließend erzeugst du dein VO und annotierst es korrekt.

Dann musst du das VO Hibernate bekannt machen, was über die configuration geht. (add Annotated class)

Und dann machst du ein ganz normalen select mit hibernate.
 

PHANTOMIAS

Aktives Mitglied
Sorry, dafür bin ich noch zu ungeübt.

Beim View muss das Datum zur Laufzeit eingesetzt werden, ebenso die Zahl bei
Java:
where b_c.b_id = 30

Die beiden Anweisungen:
SQL:
'2010-07-06' AS 'd'
0 AS 'o'
sind nur da, dass ich das Objekt vollständig habe.

Also wie erzeuge ich dann die View? Und wie annotiere ich die Klasse? Doch nicht mit Entity, dann wird ja eine Datenbanktabelle angelegt, das will ich ja nicht.

Ich habe in hibernate.cfg.xml:
[XML]<mapping class="com.myDomain.myProject.data.domain.Chart"/>[/XML]

---

In der Zwischenzeit habe ich mal alternativ das notiert:
Java:
Query query = sess.createSQLQuery(
				"select sum(DUR)" +
    " from " +
    " (select distinct a.id as ID, a.dur as DUR from b_c" +
    " inner join c on b_c.c_id = c.id " +
    " inner join a on c.id = a.c_id " +
    " inner join a_aud on a.id = a_aud.id " +
    " inner join d on a_aud.rev = d.rev " +
    " where b_c.b_id = 30 and " +
    " a_aud.stat != 1 and " +
    " DATE(FROM_UNIXTIME(revtime / 1000)) = DATE('2010-07-06')) " +
    " AS SubSelectTable");
		List list = query.list();
		List<Chart> charts = new ArrayList<Chart>();
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
		tx.commit();

		return list;
In der Zeile
Java:
System.out.println(list.get(i));
kriege ich das Ergebnis zurück.

Aber wie kriege ich das nun in ein Chart-Objekt rein?
Denn eigentlich müsste ich früher ansetzen, denn ich brauch keine Liste, sondern einfach nur das Resultat da es nur eine Ergebnis-Reihe ist und keine Liste.

Danke vielmals und Gruss PHANTOMIAS
 
M

Marcinek

Gast
Naja es kommt immer eine Liste zurück den eine query hat als ergebnis immer eine Menge ;)

Was kommt da bei dem println raus?

Kannst du TS3 kommen, denn ich denke, dass das Problem eher trivial ist, aber hier via tippen man die Intention nicht korrekt rüber bringen kann.

Gruß,

Marcinek
 

PHANTOMIAS

Aktives Mitglied
Ich habe was Gutes gefunden:
Code:
List resultWithAliasedBean = s.createSQLQuery(
  "SELECT st.name as studentName, co.description as courseDescription " +
  "FROM Enrolment e " +
  "INNER JOIN Student st on e.studentId=st.studentId " +
  "INNER JOIN Course co on e.courseCode=co.courseCode")
  .addScalar("studentName")
  .addScalar("courseDescription")
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  .list();

StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);
Das scheint zu klappen, bis dass in meiner Abfrage die Zahl 25 herauskommt und ich die gerne als double hätte. Es liefert es mir aber als Bigdecimal zurück.
SCHWERWIEGEND: IllegalArgumentException in class: com.myDomain.myProject.data.domain.Chart, setter method of property: r
14.07.2010 11:50:27 org.slf4j.impl.JCLLoggerAdapter error
SCHWERWIEGEND: expected type: double, actual value: java.math.BigDecimal
Wenn ich das noch umgehen kann, dann wäre ich für den ersten Schritt völlig zufrieden. Aber nicht dass ich als Parameter in der setR-Methode ein BigDecimal als Parameter will anstelle von double, andernfalls muss ich wieder mit der Flex-Schnittstelle kämpfen, also es muss ein double "reingehen".
 

PHANTOMIAS

Aktives Mitglied
Das hat geholfen, ist jedoch leider deprecated mit "Hibernate.DOUBLE".
Ich habe zwar auch "Lösungen" gelesen, nämlich hier:
https://forum.hibernate.org/viewtopic.php?f=1&t=1004907&view=previous
aber ich kann sie nicht bei mir anwenden, da ich die Meldung bei
Java:
private static final StringType STRING = new StringType();
erhalte, dass StringType nicht existiert... Klar, woher soll es das auch geben?

Muss ich dazu etwas importieren?

Danke + Gruss PHANTOMIAS
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2
lumo Teneo Hibernate & JPA Datenbankprogrammierung 15
Z JPA mit Hibernate - Unable to build EntityManagerFactory Datenbankprogrammierung 7
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
K Hibernate vs. JDBC Datenbankprogrammierung 4
J Hibernate Info 593 ? Datenbankprogrammierung 4
J Erstellen der SessionFactory in Hibernate 4.1 Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
N hibernate: datasource Datenbankprogrammierung 7
H MySQL Hibernate: Updaten vereinfachen Datenbankprogrammierung 2
T Hibernate Division zweier Summen Datenbankprogrammierung 4
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
F GWT und Hibernate - gwt.dev.Compler not found Datenbankprogrammierung 3
M NestedTransaction- Exception in Hibernate Datenbankprogrammierung 15
O Löschen vieler Datensätze mit Hibernate Datenbankprogrammierung 11

Ähnliche Java Themen

Neue Themen


Oben