| 

.NET C# Java Javascript Exception

findBy überschreibt Variable

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


findBy überschreibt Variable

Blindworks - 04.11.2010 09:27
Hallo zusammen,

wiedereinmal ein ganz komisches Verhalten, was ich mir nicht erklären kann.
def startDate = CounterStatusLog.findByCounterIdAndCounterWert(counter.id,1)
....
ausgabe von startDate
....
def endDate = CounterStatusLog.findByCounterIdAndCounterWert(counter.id,2)
....
ausgabe von endDate

Jetzt kommts! Die Ausgabe von startDate und endDate sind gleich. In der Datenbank liegen aber komplett verschiedene Dates.
StartDate wird richtig angezeigt, es scheint aber, dass endDate den Wert von startDate hat.

Kommentiere ich den Teil von startDate aus, dann kommt bei endDate das richtige Datum.

Übergebe ich einen Counterwert, den es nicht gibt, wird auch kein datum angezeigt -->richtiges Verhalten. Gebe ich einen validen Counterwert ein, nimmt er bei endDate den Wert von startDate.

Ich verliere langsam die Geduld mit Grails.....


Re: findBy überschreibt Variable

milkyman - 04.11.2010 09:51
Kannst du mal die Domain dazu posten und den Original-Code

Bye,
Horst


Re: findBy überschreibt Variable

Blindworks - 04.11.2010 10:11
Moin,

Die Domain:
class CounterStatusLog {
  Integer id
  String counterName
  Integer counterWert
  String aktion
  Date changedTs
  Date laufbezugsdatum
  String kommentar
  String comsId
  Integer counterId

  static mapping = {
    table'TEST_CounterStatusLog'
    version false
    id generator:'assigned', params:[type:'int']
  }

  static constraints = {
  }
}

//def startDate = CounterStatusLog.findByIdAndCounterWert(it.counter.id, 1, [sort:"changedTs", order:"desc"])
def startDate = CounterStatusLog.findAll("from CounterStatusLog as csl where csl.counterId = ? and csl.counterWert = ?", [it.counter.id,1])
           
if(startDate == null) {
  out << "<td>-</td>" 
} else {
  out << "<td>"+startDate.changedTs.toString()/*.substring(0, 19)*/+"</td>"
}

//def finishedDate = CounterStatusLog.findByIdAndCounterWert(it.counter.id, 2, [sort:"changedTs", order:"desc"])
def finishedDate = CounterStatusLog.findAll("from CounterStatusLog as csl where csl.counterId = ? and csl.counterWert = ?", [it.counter.id,2])
if(finishedDate == null) {
  out << "<td>-</td>"
} else {
  out << "<td>"+finishedDate.changedTs.toString()/*.substring(0, 19)*/+"</td>"
}


Ich habe es eben auch mal mit HQL versucht. Gleicher Fehler.

Aber mir ist was kurioses aufgefallen!
Wenn ich den zweiten Aufruf mache (also def finishedDate ......), findet er zwei Einträge in der Datenbank. --> das ist richtig.
Gebe ich die Eintrage aus, so druckt er mir das startDate zweimal aus. dieses startDate ist aber nur einmal in der Datenbank vorhanden.

Sorry für den üblen code, aber ich probiere gerade ein wenig rum.


Re: findBy überschreibt Variable

milkyman - 04.11.2010 11:47
Also ich kann erstmal nichts sehen, was dieses Verhalten begründen könnte.

Ich halte es aber für fragwürdig, das Ergebnis eines findAll einem Domain-Objekt zuzuweisen. Bei mehr als einem Treffer bekommst du ein zufälliges Objekt zurück - seidenn du arbeitest noch mit orderBy o.ä.. Wenn nur 1 Wert kommen kann, reicht ein einfacher find.

Wenn es nur um das Datum selber geht, könntest du auch mal ein executeQuery probieren.

Ich bin mir eigentlich ziemlich sicher, dass Grails/Hibernate nicht so grundsätzlich falsche Daten liefern wird.

Zur Not kannst du das Hibernate Logging mal aktivieren und schauen, welches Statement aus deiner Anfrage generiert wird. Vielleicht bringt das Licht ins dunkel.

Bye,
Horst


Re: findBy überschreibt Variable

saurier - 04.11.2010 12:36
Hat es einen bestimmten Grund, dass du offenbar mit Id's arbeitest, die nicht eindeutig sind?
Das es da Probleme gibt, überrascht mich irgendwie nicht.

Gruß,
Christian


Re: findBy überschreibt Variable

Blindworks - 04.11.2010 14:24
Hi milkyman,

vielen Dank für die Hilfe!
Mit executeQuery kommen komischerweise die richtigen Werte.

Gruß
Blindworks


Re: findBy überschreibt Variable

Blindworks - 04.11.2010 14:27
saurier schrieb:
-------------------------------------------------------
> Hat es einen bestimmten Grund, dass du offenbar
> mit Id's arbeitest, die nicht eindeutig sind?
> Das es da Probleme gibt, überrascht mich irgendwie
> nicht.
>
> Gruß,
> Christian

Hi Christian,

die nichteindeutigen IDs sind hier nicht das Problem. Die Tabelle soll nur eine History darstellen.
Ich weiss das ist mies gemacht, aber ich habe die DB nicht gebaut und darf sie auch nicht verändern.

Gruß
Blindworks


Re: findBy überschreibt Variable

mpuhlmann - 04.11.2010 15:01
Hallo,

nachdem du schon den Code für Domain Objekt und Testfall geschickt hast, wäre es da auch noch möglich die beiden betreffenden Zeilen aus der DB zu posten. Könnte evtl. hilfreich sein.

Gruss

Marco


Re: findBy überschreibt Variable

saurier - 04.11.2010 15:40
Zitat

die nichteindeutigen IDs sind hier nicht das Problem.

Wahrscheinlich doch! Hibernate braucht zwingend eine eindeutige Id - auch wenn das Feld nicht
so heißen muss und auch etwas zusammengesetztes sein darf. So wie es bei dir definiert ist,
geht Hibernate davon aus, dass "id" eindeutig ist. Daher daher kommen vermutlich die
seltsamen Ergebnisse.


Re: findBy überschreibt Variable

Blindworks - 11.11.2010 07:02
Guten Morgen,

ich habe mal aus Spass eine neue Tabelle angelegt und sie mit eindetigen IDs versehen.

Der Fehler tritt trozdem auf!
Weiterhin hatte ich den Fehler auch bei einer anderen Query auf einer anderen Tabelle.

Gruß
Blindworks


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "findBy überschreibt Variable" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.