Probleme bei Überführung von SQL-Code in eine HQL-Abfrage

Zrebna

Bekanntes Mitglied
Hi!

Folgende SQL-Abfrage funktioniert bei mir:

SQL:
select count(*) from task t join config_task ct
on t.id = ct.task_id
where ct.config_id = 100;

Jedoch wirft folgende HQL-Abfrage einen Fehler ("unexpected token: ct")

Java:
public Integer getCountTasksById(Long configId) {
        String hql = "SELECT COUNT(*) FROM " + Task.class.getSimpleName() + " t"
                + " JOIN config_task ct ON"
                + " t.id = ct.task_id"
                + "WHERE ct.config_id = :id";
        
        return ((Number) this.getSession().createQuery(hql).setParameter("id", configId).getResultList()).intValue();

Zu bemerken ist, dass die DB-Tabelle config_task keine eigene Java-Klasse ist, sondern lediglich in der Klasse 'Config' mittels der Hibernate-Annotation "@JoinTable"
als Jointabelle (Beziehungstabelle) zwischen den Klassen (sowie Tabellen) Config und Task erstellt wurde.
In der Datenbank taucht die Beziehungstabelle auch korrekt auf und speichert auch die korrekten Werte.

Der Code in der Config-Klasse zur Erzeugung der Beziehungstabelle sieht so aus:

Java:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "config_task", joinColumns = @JoinColumn(name = "config_id", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "task_id", referencedColumnName = "ID"))
    private Set<Task> tasks;

Die Klasse Config hat dann noch einen Getter und Setter für das Set<Task>.


Evtl. kann mir hier Jemand helfen, wie ich meine HQL-Abfrage zum Funktionieren bekomme.

Gruß
Zrebna
 
Hoppla, peinlich - aber Danke auch fpr den Tip:
Zum Tip: Was meinst du mit fertig gebaute Abfrage nochmal ausgeben, wenn man nach Fehlern sucht? Mit dem Debugger durchgehen?

Ansonsten bekomme ich nach dem Fix nun aber einen anderen Fehler:
Path expected for join

Weißt du, was es damit auf sich hat?

Update: Selber Fehler (Path expected for join) nach Umbau weiter gegeben.
Habe versucht die Methode anzupassen, um teils über Objekte zu gehen (sql-code funktioniert)

HQL-Code:

Java:
public Integer getCountTasksById(Long configId) {
        String hql = "SELECT COUNT(*) FROM " + Config.class.getSimpleName() + " c"
                + " JOIN config_task ct ON"
                + " c.id = ct.config_id"
                + " JOIN c.tasks t"
                + " WHERE ct.config_id = :id";
        
        return ((Number) this.getSession().createQuery(hql).setParameter("id", configId).getResultList()).intValue();
 
Zuletzt bearbeitet:
Zum Tip: Was meinst du mit fertig gebaute Abfrage nochmal ausgeben, wenn man nach Fehlern sucht? Mit dem Debugger durchgehen?
Na lass dir die gebaute Abfrage einfach einmal ausgeben auf die Konsole, oder betrachte sie im Debugger, dann waere das schonmal aufgefallen, und fuehre diese dann zum Beispiel auch haendisch auf der Datenbank aus, deckt auch viele einfache Fehler auf.

Weißt du, was es damit auf sich hat?
Ich kenne HQL nicht, aber laut Suche irgenwas damit dass die zweite Tabelle qualifiziert werden muss anhand der Ersten:

Code:
JOIN c.config_task ct ON

So oder so aehnlich.
 

Zurück
Oben