2012-05-18 6 views
1

В моем приложении, я следующие 2 сущности:EJB QL Синтаксическая ошибка

@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; 
    ... 
} 

Когда я пытаюсь получить некоторые строки из таблицы Announcement, я получаю ошибку синтаксиса на следующей строке:

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"); 

Это 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 

Я был бы очень признателен, если бы вы могли сказать мне, что я сделал неправильно здесь.

С наилучшими пожеланиями, Джеймс Tran

+0

Можете ли вы разместить столбцы ошибок? –

+0

Не могли бы вы изменить свой вопрос, чтобы добавить трассировку стека и код объектов Объявление и комментарий? – Pablo

+0

@PauKiatWee done :) –

ответ

1

Если анонс расширяет Commentable, вам не нужно объединение:

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

Проблема в том, что я использую 'InheritanceType.JOINED'. Следовательно, в таблице анонсов не будет столбца 'createdDate'. Я попробовал ваше решение раньше, и GlassFish бросил мне No Column SQLException. –

+0

@ Mr.J4mes Возможно, это ошибка? Насколько я знаю, EclipseLink должен выполнить соединение. – Pablo

+0

Спасибо, что помогли мне. Я испортил процесс создания таблицы раньше, и это вызвало эту проблему. –

1

Там нет ON пункта в JPQL. Это необязательно, потому что вы можете присоединяться только к двум сущностям, которые имеют связь между ними, и сопоставление ассоциации уже содержит необходимую информацию, необходимую для того, чтобы знать, в каких столбцах должно быть выполнено соединение. Таким образом, следующее достаточно:

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

Это предполагает, что у вас есть связь между Тун Announcement и Commentable.

EDIT: Объявление распространяется на комментарии. Таким образом, вам не нужно какое-либо соединение. Двигатель JPA ли присоединиться к вам (если необходимо присоединиться, в зависимости от стратегии наследования):

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

Проблема в том, что 'Announcement' расширяет' Commentable'. У меня нет отношений ToOne. –

+0

Вам не нужно какое-либо соединение: Объявление является комментарием. Я отредактирую свой ответ. –