2012-05-18 1 views
1

Dans mon application, j'ai les 2 entités suivantes:EJB QL Erreur de syntaxe

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public class Commentable implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    protected Long id; 
    protected long createdDate; 
    ... 
} 

@Entity 
public class Announcement extends Commentable implements Serializable { 

    private int type; 
    private String title; 
    @Column(columnDefinition = "MEDIUMTEXT") 
    private String content; 
    ... 
} 

Lorsque je tente d'obtenir des lignes de la table d'annonce, je continue à obtenir une erreur de syntaxe sur la ligne suivante:

Query q = em.createQuery("SELECT A FROM Announcement A JOIN Commentable C ON A.id = C.id WHERE A.type=:type ORDER BY C.createdDate DESC"); 

C'est le stacktrace:

Caused by: Exception [EclipseLink-8023] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [SELECT A FROM Announcement A JOIN Commentable C ON A.id = C.id WHERE A.type=:type ORDER BY C.createdDate DESC]. 
Internal Exception: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException 

Je serais très reconnaissant si vous pouviez me dire ce que je l'ai fait mal ici.

Meilleures salutations, James Tran

+0

Pouvez-vous afficher les piles d'erreur? –

+0

Pourriez-vous éditer votre question pour ajouter la trace de la pile et le code des entités Annonce et Commentable? – Pablo

+0

@PauKiatWee done :) –

Répondre

1

Si étend l'annonce commentable, vous ne devriez pas avoir besoin d'une jointure:

select a from Announcement a where a.type = :type order by a.createdDate desc 
+0

Le problème est que j'utilise 'InheritanceType.JOINED'. Par conséquent, la table Announcement n'aura pas la colonne 'createdDate'. J'ai essayé votre solution plus tôt et GlassFish m'a lancé la SQLException No Column. –

+0

@ Mr.J4mes Est-ce que c'est peut-être un bug? EclipseLink devrait faire la jointure, autant que je sache. – Pablo

+0

Merci de votre aide. J'ai foiré le processus de création de table plus tôt et cela a causé ce problème. –

1

Il n'y a pas ON clause JPQL. Ce n'est pas nécessaire car vous ne pouvez joindre que deux entités qui ont une association entre elles, et le mappage de l'association contient déjà les informations nécessaires pour savoir sur quelles colonnes la jointure doit être faite. Donc, ce qui suit est suffisante:

SELECT a FROM Announcement a JOIN a.commentable c 
WHERE a.type = :type ORDER BY c.createdDate DESC 

Cela suppose que vous avez une association entre ToOne Announcement et Commentable.

EDIT: Annonce étendue Commentable. Donc vous n'avez besoin d'aucune jointure. Le moteur JPA ne la jointure pour vous (si une jointure est nécessaire, en fonction de la stratégie d'héritage):

SELECT a FROM Announcement a WHERE a.type = :type ORDER BY a.createdDate DESC 
+0

Le problème est que 'Announcement' étend' Commentable'. Je n'ai aucune relation ToOne en eux. –

+0

Le vous n'avez pas besoin de jointure: une annonce est un commentaire. Je vais modifier ma réponse. –

Questions connexes