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));
Randnotiz: Das sieht hella kompliziert; 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

Schreibe einen Kommentar