Hibernate alias für eine einfache boolean-Feld
Ich kämpfen mit der Hibernate Criteria-API.
In der Klasse Conversation
ich habe:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "Conversation_ConversationParticipants",
joinColumns = @JoinColumn(name = "ConversationID"),
inverseJoinColumns = @JoinColumn(name = "ConversationParticipantID"))
private List<ConversationParticipant> participants;
Und in der Klasse ConversationParticipant
ich habe:
@OneToOne
@JoinColumn(name = "ParticipantID")
private User participant;
@Type(type = "true_false")
@Column(name = "Viewed")
private boolean viewed;
In meine Kriterien, die ich haben
Criteria criteria = super.createCriteria();
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.createAlias("participants", "participants");
criteria.createAlias("participants.participant", "participant");
criteria.add(Restrictions.eq("participant.id", user.getId()));
return (List<Conversation>) criteria.list();
Diesem funktioniert alles ok, und ich kann sehen, all die Gespräche, die für den gegebenen Benutzer. Jedoch, was ich will, ist zu sehen, all die Gespräche, die der Benutzer noch nicht betrachtet noch nicht. So zu tun, ich versuche zu ergänzen:
criteria.add(Restrictions.eq("participants.viewed", false));
Jedoch, diese gibt 0 zurück, Gespräche (wenn ich 'true' bekomme ich das gleiche Ergebnis und ich habe db und sorgte dafür, dass es Werte gibt, die sowohl mit true und false). Wie kann ich das erreichen? Was mache ich falsch?
Die Abfrage, die ausgeführt wird:
from
Conversations this_
inner join
Conversation_ConversationParticipants participan4_
on this_.id=participan4_.ConversationID
inner join
ConversationParticipants participan1_
on participan4_.ConversationParticipantID=participan1_.id
inner join
Users participan2_
on participan1_.ParticipantID=participan2_.id
where
participan1_.Viewed=?
and participan2_.id=?
DB-Tabelle:
CREATE TABLE ConversationParticipants(ID BIGINT NOT NULL IDENTITY, Viewed CHAR(1), Type VARCHAR (255), ParticipantID BIGINT, PRIMARY KEY (ID));
Basierend auf der Antwort unten, ich war in der Lage, um es arbeiten mit:
criteria.add(Restrictions.eq("participants.viewed", Boolean.FALSE));
AS
,WHERE
und JOIN
Klauseln in SQL und Linq sind viel einfacher. Ich kann sehen, warum bist du straguling.Sollte dies funktionieren. Was ist die generierte SQL-Abfrage und die Werte gebunden, auf die vorbereitete Anweisung? Ich Frage mich, ob die true_false Typ ist nicht das, was verursacht die Schwierigkeiten. Außerdem, warum bist du nicht mit HQL für solch eine statische Abfrage. Kriterien ist nützlich für dynamische Abfragen, aber es macht die Dinge komplizierter und weniger lesbar, als Sie sein sollten für statische Abfragen.
Ich habe die Abfrage, die generiert wird. Wie für nicht mit HQL, auch ich bin nicht sicher, wie Sie Sie schreiben, und alles andere ist dynamisch, also denke ich, dass es nicht ein echtes Problem, es zu benutzen Kriterien auch hier
InformationsquelleAutor Boris Horvat | 2012-12-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie zu tun versuchen, ist theoretisch richtig und sollte funktionieren. Dennoch, ich bin am überlegen, einige mögliche Dinge, die möglicherweise erweisen sich als falsch:
Stellen Sie sicher, dass Ihre get-und Set-sind Sie richtig eingesetzt. Ihr code sollte wie folgt Aussehen:
Stellen Sie sicher, dass Ihre DB-Feld ist ein
BIT
(oder den entsprechenden Datentyp für Boolesche Werte auf die DB, die Sie verwenden).Wenn weder 1 noch 2 Arbeit, ich schlage vor, entfernen die
@Type
Vermerk, es ist nicht notwendig, obwohl es sollte nicht Schaden.Edit:
Sie versuchen, anzeigen einer
boolean
zu einemchar
. Ich verstehe nicht wirklich, warum würden Sie einenchar(1)
statt einerBIT
. Dennoch, wenn Sie so wollen, arbeiten Sie mit einemString
in der model-Klasse.Dann, wenn Sie Ihre DB-Spalte enthält 0 oder 1, Verwendung:
Oder wenn Sie Ihre DB-Spalte enthält true/false, Verwendung:
Siehe mein editierten post.
Hi, tnx für die Hilfe. Ich habe tatsächlich versucht haben, bevor, dein Beispiel hat mich zum nachdenken und schließlich wollte ich mit Boolean.FALSCH-und es funktionierte.
Ich bearbeitete Ihre Antwort, weil die
"false"
fehl. verwenden Sie den Datentyp selbst z.B.false
oder0
statt.InformationsquelleAutor Raul Rene