Hibernate Kriterien-Liste zu iterieren
Habe ich den folgenden Abschnitt von code, den ich verwenden wollte, um wieder eine Sammlung meiner Objekt:
Session session = HibernateUtil.getSession();
List<MyObj> myObjList = (List<MyObj>)
session.createCriteria(MyObj.class)
.add(Restrictions.eq("searchField", searchField)).list();
Iterator<MyObj> myObjIt = myObjList.listIterator();
log.debug("list size: " + myObjList.size());
while(myObjIt.hasNext()){
MyObj myObj = myObjIt.next();
log.debug(myObj.getMyField());
}
Aber mein log hält den Druck den gleichen Datensatz, so oft wie die Größe der Liste. Wenn ich etwas umgestalten, mein code funktioniert korrekt, wie diese:
SQLQuery query = session.createSQLQuery(
"select my_field from my_table where search_field = :searchField"
);
query.setParameter("myField", myField);
List result = query.list();
for(Iterator iter = result.iterator(); iter.hasNext();){
Object[] row = (Object[]) iter.next();
log.debug(row[0]);
}
Mache ich etwas falsch, in meinem ersten code-segment? Ich sollte in der Lage sein zu gehen über diese entweder Weg, und da bin ich mit Hibernate, würd ich eher ORM funktionieren wie erwartet, so würde ich lieber das bisherige Verfahren über die letzteren. Jemand irgendwelche Gedanken?
Fwiw, ich bin mit Hibernate 3.5.4 abschließende, Hibernate-validator 4.2.0 Final, hibernate-search 3.4.0-Finale und hibername-c3p0 3.6.5 Finale, alle aus dem maven-repos.
Bearbeitet, um zu klären, basierend auf Kommentare.
Sorry. Ich habe klargestellt. Ich bin auf der Suche auf einem Feld, das einen Wert haben wird, auftreten, viele Male, und bin auf der Suche nach anderen Feld Werte. Hab verloren, wenn ich verdeckt war, was ich Tat, ein wenig.
InformationsquelleAutor dmcnelis | 2011-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus, was Sie beschrieben haben, in der Frage, Ihr beide code-Segmente sollten dieselben Ergebnisse zurückgegeben. Unter der Annahme, dass im ersten code-segment Hibernate ausführt ziemlich die gleiche Abfrage wie im zweiten segment (Sie können es im Protokoll, aktivieren Sie einfach 'hibernate.show_sql' config-parameter) - problem ist irgendwo bei der Umwandlung Ergebnis auf MyObj Liste. Es ist ziemlich unwahrscheinlich, dass es passiert aufgrund eines Fehlers im Ruhezustand, so kann es durch falsche entity-Klasse mapping. Wenn Sie nicht sehen, keine Probleme mit der Zuordnung, fügen Sie bitte weitere details zu der Frage (entity-Klasse mit Zuordnungen, db-Tabelle, schema-und Daten-Beispiel), so dass jeder das Problem reproduzieren kann.
Wahrscheinlich Ihre MyObj-Klasse hat keine Id-Spalte mapping korrekt definiert. Zum Beispiel, wenn das Feld/die Eigenschaft zugeordnet, die als Id den gleichen Wert für alle Objekte in der Ergebnisliste, hibernate zurück gleichen Objekte (wie in Ihrem Fall).
Bezüglich der Verwendung von primitiven, die als Id-Typ: hibernate erlauben, mit primitiven Typen, aber es hat die folgende Zeile in die Google docs:
Zusammenfassung möglich Id-mapping-Probleme:
1. Id zugeordneten Spalte ist nicht eindeutig in der db.
2. Entsprechende setter für die Id-Eigenschaft getter abgebildet ist, nicht angegeben oder nicht wirklich sparen übergebenen Arguments Wert.
3. Nicht-nullable-Typ-Id-Feld.
Das Feld zugeordnet ist-Id, ist es einzigartig? Ich meine, funktioniert die folgende Abfrage zurück, andere 'my_id' für jede Zeile: 'wählen Sie my_id, my_field aus meine_tabelle where search_field = :Obere Suchfeld'
Ja, tut es, das Feld zugeordnet zu 'my_id' ist der primary key für das Feld. Es ist erklärt in meinem code wie @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="my_id") protected int myId;
Sorry nach unten verschoben, hier von der ursprünglichen Frage... Wie über das hinzufügen, Protokoll.debug(myObj.getId() + "/" +myObj.getMyField()); um sicherzustellen, Sie werden immer entweder die gleichen oder unterschiedliche Zeilen zurück ... nicht die ganze Antwort, aber könnten helfen, zu provozieren, meine Ideen über das, was geschieht, kann
Es hält die Rückgabe die id 0. Die minimale id in der Tabelle ist 1
InformationsquelleAutor Andrey