[HIbernate] native update query

Pagina: 1
Acties:

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:05
Is het mogelijk om een native query update uit te voeren via hibernate?

ik heb namelijk het volgende probleem, een lijst van objecten waarvan 1 veld een boolean is die slechts in 1 object van die lijsten op actief mag geplaatst worden.

ik wil dus nu als de gebruiker een object van deze lijst aanmaakt of wijzigt en hij plaatst dit veld op actief ervoor zorgen dat in alle andere objecten (kan in feite slechts 1 object zijn, maar niet echt mogelijk om bij te houden welk) dit veld op inactief geplaatst wordt vooraleer dat object (terug) op te slaan. Hiervoor had ik volgende in gedachten

Java:
1
session.createSQLQuery("UPDATE pserser SET transferService = 0 WHERE serviceProviderID = " + service.getServiceProvider().getServiceProviderID(), "service", Service.class).list();


maar deze query geeft uiteraard geen lijst terug (krijg een java.sql.SQLException: Cursor state not valid. fout)

hoe kan ik 1 operatie een heel deel rijen van een tabel aanpassen via hibernate ?

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Je kan gewoon je eigen sql (en hql) statements afvuren op Hibernate, hoe staat beschreven in de documentatie. Echter je verhaal is al bijna pseudocode voor wat er moet gebeuren.
Door de lijst lopen, de boolean op false zetten en opslaan. Of als je zeker weet dat er maar een kan veranderen eerst het object selecteren dat op dit moment true is, deze aanpassen en dan de nieuwe opslaan. Dit kan allemaal met wat hibernate je biedt.

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:05
met bovenstaande code krijg ik dus die cursus exeception, lijkt me wel normaal want een update statement geeft geen records terug en ik roep de functie .list() op

.scroll en .iterate geeft ie een fout dat deze nog niet geïmplementeerd zijn. (al betwijfel ik of deze zullen werken)

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Kan je niet een trigger op je tabel plaatsen die laten triggeren als het 'actief'-veld verandert van een record en een tweede voor als er een nieuw record wordt aangemaakt?
Dit lijkt me typisch iets dat erg handig met triggers opgelost kan worden, nadeel is natuurlijk wel dat het dan niet in Hibernate's caching komt te staan, maar als je zelf ook al om hibernate heen wil werken had je dat toch al niet

Overigens kan een update-query geen cursor teruggeven, en dus kan je er nooit een 'list' van maken. Scroll en iterate zouden om dezelfde reden niet werken.

Wellicht heb je wat aan uniqueResult

[ Voor 17% gewijzigd door ACM op 16-11-2004 15:22 ]


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:05
ik blijf dezelfde error krijgen:

code:
1
2
3
4
5
6
7
8
Hibernate: UPDATE pserser SET transferService = 0 WHERE serviceProviderID = 129
[16/11/04 15:32:04:420 CET]  c97893c JDBCException W net.sf.hibernate.util.JDBCExceptionReporter  SQL Error: -99999, SQLState: 24000
[16/11/04 15:32:04:436 CET]  c97893c JDBCException E net.sf.hibernate.util.JDBCExceptionReporter  Cursor state not valid.
[16/11/04 15:32:04:452 CET]  c97893c JDBCException W net.sf.hibernate.util.JDBCExceptionReporter  SQL Error: -99999, SQLState: 24000
[16/11/04 15:32:04:467 CET]  c97893c JDBCException E net.sf.hibernate.util.JDBCExceptionReporter  Cursor state not valid.
[16/11/04 15:32:04:530 CET]  c97893c JDBCException E net.sf.hibernate.util.JDBCExceptionReporter  SQLException occurred
[16/11/04 15:32:04:545 CET]  c97893c JDBCException E net.sf.hibernate.util.JDBCExceptionReporter  TRAS0014I: The following exception was logged java.sql.SQLException: Cursor state not valid.
    at com.ibm.as400.access.JDError.throwSQLException(JDError.java:382)

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Een update geeft geen resultaat terug, dat is wat deze functie doet en dus zal die niet werken.

Je kan gewoon sql statements afvuren op het session.getConnection() java.sql.Connection object, of je doet het binnen het hibernate gebeuren, wat prima kan.

code:
1
2
3
4
5
6
Pojo o;
for (int x = 0; x < list.size(); x++) {
  o = (Pojo) list.get(x);
  o.setMyBoolean(false);
  session.update(o);
}

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:05
Gert schreef op dinsdag 16 november 2004 @ 15:45:
of je doet het binnen het hibernate gebeuren, wat prima kan.

code:
1
2
3
4
5
6
Pojo o;
for (int x = 0; x < list.size(); x++) {
  o = (Pojo) list.get(x);
  o.setMyBoolean(false);
  session.update(o);
}
zal dergelijke code niet vreselijk inperformant zijn ?

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Wat denk je dat Hibernate zelf zou doen? Ergens moet het de waardes om het statement mee op te vullen vandaan halen.

[ Voor 49% gewijzigd door Gert op 16-11-2004 16:05 ]


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:05
en volgens mij heeft hibernate die objecten in de lijst gecached, en voert dus enkel een query uit als die gewijzigd is ? of verwacht ik hier teveel van hibernate ?

[ Voor 81% gewijzigd door Cuball op 16-11-2004 16:07 ]

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dat staat toch allemaal in de hibernate-manual wat je nu vraagt?

  • bloody
  • Registratie: Juni 1999
  • Laatst online: 09:53

bloody

0.000 KB!!

Wellicht kun je ff kijken naar hibernate3. Daarmee kun je in je mapping files gewoon sql kwijt. (als je dat perse wilt ;) ).

Eigenlijk is hibernate niet bedoelt om gewoon wat queries af te vuren, maar worden objecten gestored en gerestored (hibernate == winterslaap).

nope


Verwijderd

kijk eens naar ibatis...

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
In hibernate 2 kan je ook sql statements (named-queries) in mapping bestanden stoppen. Daarnaast is 3 nog alpha volgens mij dus dat zou ik alleen toepassen als het project voorlopig nog niet in productie gaat. ;)
Pagina: 1