# JPQL WHERE != Objekt



## y0dA (28. Jul 2010)

Hi!

Ist folgendes möglich bzw wie schreibt man das korrekt:


```
SELECT o FROM Objekt o WHERE o <> :neuesObjekt
```
neuesObjekt ist vom Typ Objekt und ich möchte alle Objekte laden die ungleich "neuesObjekt" sind.
Geht das irgendwie so (anscheinend nicht, weil ich bekomme eine Exception) oder muss ich mit einem Feld prüfen?


----------



## maki (28. Jul 2010)

Das wäre imho das schlechteste was man machen kann...

Um equals zu nutzen braucht man Objekte, da reicht keine SQL Query, d.h. es müsste jede Entity instanziiert werden um dann equals darauf aufzurufen.. :autsch:

Solche Abfragen sind tunlichst zu vermeiden imho

Was willst du denn eigentlich machen?


----------



## y0dA (28. Jul 2010)

steht ja da:
*neuesObjekt ist vom Typ Objekt und ich möchte alle Objekte laden die ungleich "neuesObjekt" sind.*
Also sollte ich mit irgendeinem feld prüfen:

```
SELECT o FROM Objekt o WHERE o.id <> :neueId
```


----------



## maki (28. Jul 2010)

Du musst schon genauer werden....

Auf ungleiche ID zu prüfen ist sinnfrei, da diese immer ungleich sein müssen per Definition, was genau ist denn neuesObjekt?
Ein transientes Objekt? Irgendein anderes Objekt?

Deswegen die Frage, was du _eigentlich_ machen möchtest...

Aber ja, in den where clauseln vergleicht man am besten Attribute...


----------



## y0dA (28. Jul 2010)

auf ungleiche IDS zu prüfen ist nicht sinnfrei, das sind nämlich keine Primarykeys sondern Fremdschlüssel und in dieser Tabelle können selbige mehrmals auftreten. Warum sollte man nur mit Attribute prüfen? Dachte wenn ich wb.person <> :neuePerson prüfe dass im Hintergrund eh der Primärschlüssel für den Vergleich herangezogen wird?


```
SELECT wb FROM WBTabelle wb WHERE wb.person <> :neuePerson
```
Also so klappt das Statement nun und sowohl wb.person als auch neuePerson sind ja instanziert (im früheren Verlauf aus der DB geladen worden) sonst würde ich das ja gar nicht versuchen wollen - warum sollte das nun schlecht sein? finde dies schöner als von "neuePerson" nur die ID durchzureichen und jene zu prüfen. Ausserdem mache ich hier *kein nativ* SQL sondern setze das Statement so zusammen:


```
Query query = getEntityManager().createQuery(sb.toString());
```


----------



## maki (28. Jul 2010)

> Also so klappt das Statement nun und sowohl wb.person als auch neuePerson sind ja instanziert (im früheren Verlauf aus der DB geladen worden) sonst würde ich das ja gar nicht versuchen wollen - warum sollte das nun schlecht sein?


Ja, aber wenn man mal zufällig nciht die ganze Tabelle im Speicher hat werden das viele sinnlose SQL Statements, da kann dann nciht mehr viel optimiert werden.



> finde dies schöner als von "neuePerson" nur die ID durchzureichen und jene zu prüfen.


Warum auf id prüfen sinnfrei hatte ich schon erklärt, es darf gar keine 2 Entitäten mit derselben geben.

Nahctrag: 


> auf ungleiche IDS zu prüfen ist nicht sinnfrei, das sind nämlich keine Primarykeys sondern Fremdschlüssel und in dieser Tabelle können selbige mehrmals auftreten.


Wieso sagst du dass denn nicht gleich?

Hast immer noch nciht gesagt was du eigentlich vorhast...


----------



## mvitz (28. Jul 2010)

Es wäre trotzdem evtl. sinnvoller du erläuterst uns, was du genau machen möchtest. Es gibt nämlich wie von maki schon angedeutet evtl. einen besseren/sinnvolleren Weg das zu tun.


----------



## y0dA (28. Jul 2010)

Also nochmal..

Ich habe eine Tabelle Waffenbesitz, selbige hat folgende Felder:
ID (PK), Waffe(FK), Person(FK), gueltigVon, gueltigBis

Ich möchte nun für eine Liste alle Waffenbesitze ausgeben welche nicht von der eingeloggten Person sind und die noch gueltig sind, sprich gueltigBis nicht gesetzt wurde.

Deshalb:

```
SELECT wb FROM Waffenbesitz wb WHERE wb.gueltigBis IS NULL AND wb.person <> :neuePerson
```


----------



## y0dA (29. Jul 2010)

Toll, nun habe ich mich "offenbart" und nun gibts keine Rückmeldung mehr?


----------



## y0dA (29. Jul 2010)

Habe es nun so umgesetzt:


```
SELECT wb FROM Waffenbesitz wb WHERE wb.gueltigBis IS NULL AND wb.person.id <> :neuePersonId
```


----------



## andiv (29. Jul 2010)

Wie wärs du benennst einfach deine Variable "neuePersonId" in "personId" um? Sonst hast du diesen Widerspruch, dass eine neu erstellte Id normalerweise noch nirgendwo verwendet wird. Davon abgesehen kann ich jetzt auch nicht sehen, was an deinem Vorgehen schlecht sein sollte.


----------

