1

私のアプリには、次の2つのエンティティがあります。

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

アナウンステーブルからいくつかの行を取得しようとすると、次の行で構文エラーが発生し続けます。

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

これはスタックトレースです:

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

ここで私が間違ったことを教えていただければ幸いです。

よろしく、ジェームス・トラン

4

2 に答える 2

1

Announcement が Commentable を拡張する場合、join は必要ありません。

select a from Announcement a where a.type = :type order by a.createdDate desc
于 2012-05-18T12:28:41.573 に答える
1

ONJPQLには句がありません。結合できるのは、それらの間に関連付けられている 2 つのエンティティのみであり、関連付けのマッピングには、結合を行う必要がある列を知るために必要な情報が既に含まれているため、これは必要ありません。したがって、以下で十分です。

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

Announcementこれは、 と の間にToOne アソシエーションがあることを前提としていますCommentable

編集: アナウンスはコメント可能を拡張します。したがって、参加する必要はありません。JPA エンジンが結合を行います (結合が必要な場合は、継承戦略によって異なります)。

SELECT a FROM Announcement a WHERE a.type = :type ORDER BY a.createdDate DESC
于 2012-05-18T12:20:23.313 に答える