[Hibernate]Hql wordt verkeerd uitgevoerd*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Ik heb een HQL query geschreven die ik in hibernate gebruik:

Java:
1
query = session.createQuery("FROM Zetel zetel WHERE zaalId = "+zaal.getId()+" AND zetel.id NOT IN (SELECT zetelNr FROM Reservatie zetelNr WHERE voorstellingId="+voorst.getId()+")");


Wanneer deze query wordt uitgevoerd in java zie ik dat hij hetvolgende doet :

FROM Zetel zetel WHERE zaalId = 10 AND zetel.id NOT IN (SELECT zetelNr FROM Reservatie zetelNr WHERE voorstellingId=7 ..

In java geeft dit totaal het verkeerde resultaat, hij toont records die er niet mogen zijn.

Wanneer ik deze query nu uitvoer in MYSQL zelf

MySQL:
1
SELECT * FROM zetel WHERE zaalId=10 AND id NOT IN (select zetelNr FROM reservatie WHERE voorstellingId=7)


Dan geeft hij wel het gewenste resultaat.

Wat kan er verkeerd gaan ?

Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
Weet je zeker dan voorst.getId() en zaal.getId() de goede waarden terug geven? Heb je al geprobeerd de query te printen voor je m uitvoerd?

petersmit.eu


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Ja want dit geeft hij als debug info:

FROM Zetel zetel WHERE zaalId = 10 AND zetel.id NOT IN (SELECT zetelNr FROM Reservatie zetelNr WHERE voorstellingId=7

en daarmee heb ik mijn sql query gewoon opgebouwd:

SELECT * FROM zetel WHERE zaalId = 10 and zetel.id NOT IN (SELECT zetelNr FROM reservatie WHERE voorstellingId = 7 )

om in mysql uit te voeren en die geeft een ander resultaat (dus ookal zou deze waarde niet kloppen dan zou het resultaat nog hetzelfde moeten zijn.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Is je mapping file goed ?
Heb je het al eens geprobeerd met een eenvoudigere query ? Wat als je nu eens eerst gewoon 'FROM Zetel WHRE zaalId = 10' doet , krijg je dan wel goede resultaten ?

Met de beperkte info in de TS kunnen we je alleszins niet goed helpen.

Hoe ziet de SQL query er uit die Hibernate uiteindelijk genereert op basis van die HQL en naar je DB stuurt ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
De mapping file werkt normaal goed, ik kan zoals het moet gegevens wegschrijven naar de DB.

Ik heb net een "simpele" query uitgevoerd en dat geeft wel het gewenste resultaat, dit is trouwens de SQL query die hij naar de db stuurt. (dit is de volledige query).

MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Hibernate: 
    /* 
FROM
    Zetel zetel 
WHERE
    zaalId = 10 
    AND zetel.id NOT IN (
        SELECT
            zetelNr 
        FROM
            Reservatie zetelNr 
        WHERE
            voorstellingId=7
    ) */ select
        zetel0_.id as id12_,
        zetel0_.nummer as nummer12_,
        zetel0_.zaalId as zaalId12_ 
    from
        zetel zetel0_ 
    where
        zaalId=10 
        and (
            zetel0_.id not in  (
                select
                    reservatie1_.id 
                from
                    reservatie reservatie1_ 
                where
                    voorstellingId=7
            )
        )


==> Als ik deze query uitvoer dan klopt het met wat ik in java zie maar dit is verkeerd :s ik wil dus dat hij hetvolgende uitvoerd:

code:
1
2
SELECT * FROM zetel WHERE zaalId = 10 AND zetel.id NOT IN (SELECT zetelNr FROM 
reservatie WHERE voorstellingId = 7)


Hoe pas ik mijn query aan zodat hij dit laatste uitvoert ?

[ Voor 14% gewijzigd door bibawa op 01-11-2007 21:35 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Ben je zeker dat zetelnr in je Reservatie object naar de juiste column mapped in de DB ?

Bekijk de query die Hibernate gegenereerd heeft nog eens goed, en bekijk je HQL query eens:

in je HQL query schrijf je SELECT zetelnr from reservatie
en Hibernate genereert SELECT reservatie.id from reservatie

Vandaar dat het mis gaat natuurlijk.
Of kan het te maken hebben met het feit dat je een (onnodige) alias geeft aan 'Reservatie' in je HQL ?

code:
1
2
3
4
SELECT
            zetelNr 
        FROM
            Reservatie zetelNr

Waarom geef je Reservatie een alias die je zetelNr heet ? Is onnodig, en het maakt de boel ook niet duidelijker als je je Reservatie gaat aliassen naar 'zetelnr'.

verder:
met wat ik in java zie
Java is een taal, dus daar zie je geen output .... :X

[ Voor 6% gewijzigd door whoami op 01-11-2007 21:39 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
De mapping is goed gebeurd, die alias heb ik extra toegevoegd omdat ik anders de fout:

Java:
1
2
xception in thread "main" java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode 
 \-[IDENT] IdentNode: 'zetelNr' {originalText=zetelNr}


krijg :s

Mijn mapping in Reservatie is :

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="model.Reservatie" table="reservatie">
        <id name="Id" column="id">
            <generator class="identity"/>
        </id>

        <many-to-one name="voorstelling" column="voorstellingId" cascade="all"/>
        <many-to-one name="zetel" column="zetelNr" cascade="all"/>
        <many-to-one name="verkoop" column="verkoopId" cascade="save-update"/>

    </class>
</hibernate-mapping>


Dus er ligt een many-to-one naar de tabel "zetel" en in de tabel reservatie noemt het veld zetelNr dat klopt dus

Edit:

Het enige waar ik nu zo momenteel aan kan zeggen van "dat zou het probleem kunen zijn" is dat ik vorige week heel hard heb zitten klooien om deze relatie in orde te krijgen.. Ik heb het uiteindellijk gevonden door tussen reservatie en verkoop een relatie in 2 richtingen te leggen.. Ik weet eigenllijk niet echt of dit nu iets met het probleem te maken heeft :s

[ Voor 14% gewijzigd door bibawa op 01-11-2007 23:00 ]


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Klein upje..

Iemand die een ideetje heeft ?

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 22:00

Salandur

Software Engineer

voor de mapping van reservatie naar zetel moet je in de select binnen not in zetel.id gebruikeren en niet zetelnr. waarschijnlijk weet hij niet welk veld hij moet gebruiken en kan dus niet goed geresolved worden

code:
1
query = session.createQuery("FROM Zetel zetel WHERE zaalId = "+zaal.getId()+" AND zetel.id NOT IN (SELECT reservatie.zetel.id FROM Reservatie reservatie WHERE voorstellingId="+voorst.getId()+")");


je gebruikt dus het verkeerde veld. een database veld kan je niet gebruiken in een HQL query

[ Voor 10% gewijzigd door Salandur op 02-11-2007 13:46 ]

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Ja, je HQL klopt niet, zoals ik al zei in een van m'n eerdere posts.
Ik ben nu zelf zo geen expert in HQL, maar volgens mij ga je in HQL gaan praten tegen objecten, en niet tegen 'columns' (wat jij met je subquery wel doet).

code:
1
AND zetel.id NOT IN (SELECT zetelNr FROM Reservatie zetelNr

In dit stukje van je HQL ga je gaan werken met de zetel.id property.
Je Reservatie class heeft echter geen property die zetelNr heet, die heeft wel een property 'Zetel' .

Daarnaast -zoals ik reeds in een eerdere post gezegd heb- wat doet die zetelNr alias daar ?
Zoals het er nu staat, gaat Hibernate volgens mij gewoon het reservatie object gaan ophalen, want je Reservatie heb je nu ge-aliassed naar 'zetelNr', en je selecteert 'zetelNr' ( == het Reservatie object dus; vandaar dat Hibernate een query genereert die er uit ziet als 'SELECT reservatie.id' ipv dat het zetelnr gereturned wordt.
Als je die HQL nu eens zo schrijft:
code:
1
AND zetel.id NOT IN (SELECT Reservatie.Zetel FROM Reservatie ...

Zou dat dan niet beter zijn ?

Dit is eigenlijk gewoon een kwestie van even goed kijken, logisch nadenken en debuggen.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Salandur schreef op vrijdag 02 november 2007 @ 13:45:
voor de mapping van reservatie naar zetel moet je in de select binnen not in zetel.id gebruikeren en niet zetelnr. waarschijnlijk weet hij niet welk veld hij moet gebruiken en kan dus niet goed geresolved worden

code:
1
query = session.createQuery("FROM Zetel zetel WHERE zaalId = "+zaal.getId()+" AND zetel.id NOT IN (SELECT reservatie.zetel.id FROM Reservatie reservatie WHERE voorstellingId="+voorst.getId()+")");


je gebruikt dus het verkeerde veld. een database veld kan je niet gebruiken in een HQL query
Thnx dit werkt , maar ik heb hier toch nog een vraag bij;

waarom doe je in de innerselect reservatie.zetel.id zetel.id kan ik volgen (dus uit de klasse Zetel het attribuut id) maar waarom dan nog reservatie ervoor ?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Omdat zetel niet in de from staat en het uit het reservatie object komt.

Snap je ook waarom die methode nu wel werkt ?

[ Voor 17% gewijzigd door whoami op 03-11-2007 16:50 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 22:00

Salandur

Software Engineer

bibawa schreef op zaterdag 03 november 2007 @ 14:31:
[...]


Thnx dit werkt , maar ik heb hier toch nog een vraag bij;

waarom doe je in de innerselect reservatie.zetel.id zetel.id kan ik volgen (dus uit de klasse Zetel het attribuut id) maar waarom dan nog reservatie ervoor ?
het is niet noodzakelijk, maar dan is het wel duidelijker welk object geselecteerd wordt.

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Idd, eigenlijk hetzelfde als je zou een columnname prefixen met de table-name in SQL.

Is het echter nodig om het ID te gaan specifieren in die specifieke HQL query van de topicstarter ?
Als je 'SELECT Reservatie.Zetel' of 'SELECT Zetel' zou doen, zal Hibernate dit dan ook niet gewoon gaan vertalen naar 'SELECT ZetelNr' ?
(Zoals het trouwens gebeurd bij de HQL die de TS in z'n topicstart neergezet heeft). Je specifieert nl. geen property, dus denk ik dat Hibernate er dan van uit gaat dat hij de property moet selecteren die het object identificeert.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Jup jup het werkt nu dus omdat je niet mag refereren naar kolomnamen, ik heb dit altijd gedaan maar heb het even nagekeken en heb ook altijd dezelfde naam van m'n variabele gebruikt dusja :p ;)
Pagina: 1