2

@SQLResultSetMapping オブジェクトで指定したものではなく、結果セットのオブジェクトが「オブジェクト」にキャストされています。

ConstructorResult のハンドルを取得しようとしていて、単純な結合を含むクエリを作成し、結果セットを取得してループさせようとしていますが、それを出力して正しいことを確認しています。しかし、私がループに到達したとき、それは単純なはずのように見えますが、そうではありません。

結果リストを宣言すると、型にキャストされます。クエリ テスト クラスをステップ実行すると、クエリが正常に実行されて結果に読み込まれますが、結果リストの項目は CommentInfoListItemDTO オブジェクトではなく「オブジェクト」と入力されています。そのため、ループに到達すると、クラス キャスト例外が発生します。結果が CommentInfoListItemDTO オブジェクトにキャストされないのはなぜですか? 特にこれが @SQLResultSetMapping で指定されている場合。

コードは以下に掲載されています...列名の一部を短くするために切り捨てました。再度追加するのに役立つ場合は、お知らせください。

public List<CommentInfoListItemDTO> getCommentTitleListByPersonId(BigInteger personId) {
    String queryString = "select c.article_id, "
                        ***[columns removed for brevity]***
                        + "c.person_id as comment_person_id, "
                        + "a.party_id as aticle_party_id "
                        + "from article_comment c "
                        + "join article a "
                        + "on a.article_id = c.article_id "
                        + "where c.person_id = :personId";

    Query q = em.createNativeQuery(queryString, "CommentInfoListItemDTOMapping");
    q.setParameter("personId", personId);

    List<CommentInfoListItemDTO> commentInfoList = q.getResultList();

    ***[throws exception on the next line]***
    ***[java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com...CommentInfoListItemDTO]***

    for (CommentInfoListItemDTO listElement : commentInfoList){
            System.out.println("COMMENT TITLE LIST: " + listElement.toString());
        }
    return (commentInfoList);
}

@SqlResultSetMapping --

EDITED -- これが既存のエンティティ クラスにどのように配置されたかを示します。

EDITED - マッピングの列リストにデータ型を追加しようとしました。役に立ちませんでした。結果セットの各レコードは、Hibernate 内のどこかでまだ java.lang.Object にキャストされており、DTO にキャストし直すことはできません。結果セットマッピングは Hibernate によってバインドされています:

情報: 結果セット マッピングのバインディング: CommentInfoListItemDTOMapping

@Entity
@SqlResultSetMapping(name = "CommentInfoListItemDTOMapping", classes = {
    @ConstructorResult(targetClass = CommentInfoListItemDTO.class,
            columns = {
            @ColumnResult(name = "article_id", type=BigInteger.class),
            @ColumnResult(name = "article_comment_id", type=BigInteger.class),
            @ColumnResult(name = "parent_comment_id", type=BigInteger.class),
            @ColumnResult(name = "article_title", type=String.class),
            @ColumnResult(name = "article_published", type=Boolean.class),
            @ColumnResult(name = "article_publish_date", type=Calendar.class),
            @ColumnResult(name = "article_availability_state", type=String.class),
            @ColumnResult(name = "article_enable_comments", type=Boolean.class),
            @ColumnResult(name = "comment_title", type=String.class),
            @ColumnResult(name = "comment_hide", type=Boolean.class),
            @ColumnResult(name = "comment_created_timestamp", type=Calendar.class),
            @ColumnResult(name = "comment_person_id", type=BigInteger.class),
            @ColumnResult(name = "aticle_party_id", type=BigInteger.class)
            })
})

@Table(name = "article_comment")
@NamedQueries({
    @NamedQuery(name = "ArticleComment.findAll", query = "SELECT e FROM ArticleComment e")})

public class ArticleComment implements Serializable {
...

ポジョ

public class CommentInfoListItemDTO implements Serializable {

    private Integer id;
    private BigInteger articleId;
    private BigInteger articleCommentId;
    private BigInteger parentCommentId;
    private String articleTitle;
    private Boolean articlePublished;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Calendar articlePublishDate;
    private String articleAvailabilityState;
    private Boolean articleEnableComments;
    private String commentTitle;
    private Boolean commentHide;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Calendar commentCreatedTimestamp;
    private BigInteger commentPersonId;
    private BigInteger articlePartyId;

    public CommentInfoListItemDTO() {
    }

    public CommentInfoListItemDTO(BigInteger articleId, BigInteger articleCommentId, 
            BigInteger parentCommentId, String articleTitle, Boolean articlePublished, 
            Calendar articlePublishDate, String articleAvailabilityState, 
            Boolean articleEnableComments, String commentTitle, Boolean commentHide, 
            Calendar commentCreatedTimestamp, BigInteger commentPersonId, 
            BigInteger articlePartyId) {
        this.articleId = articleId;
        this.articleCommentId = articleCommentId;
        this.parentCommentId = parentCommentId;
        this.articleTitle = articleTitle;
        this.articlePublished = articlePublished;
        this.articlePublishDate = articlePublishDate;
        this.articleAvailabilityState = articleAvailabilityState;
        this.articleEnableComments = articleEnableComments;
        this.commentTitle = commentTitle;
        this.commentHide = commentHide;
        this.commentCreatedTimestamp = commentCreatedTimestamp;
        this.commentPersonId = commentPersonId;
        this.articlePartyId = articlePartyId;
    }

最後に、結果セットを CommentInfoListItemDTO オブジェクトではなくオブジェクトとして表示するデバッガーからのスクリーングラブ。ただし、正しい情報はオブジェクトにあります。

最後に、結果セットを CommentInfoListItemDTO オブジェクトではなくオブジェクトとして表示するデバッガーからのスクリーングラブ。

4

1 に答える 1

0

java.lang.ClassCastException: [Ljava.lang.Object; YourDTO にキャストできません

YourDTOに渡されたの名前がEclipseLinkで見つからない場合にスローされます。

em.createNativeQuery("SELECT...","YourDTO");

同様の状況で Hibernate によってスローされる例外は次のとおりです。

org.hibernate.MappingException: Unknown SqlResultSetMapping [someNonExistingMappingName]

YourDTOが永続化プロバイダーによって登録されていることを確認する必要があります。どのように?ログを観察します。

休止状態:

DEBUG annotations.ResultsetMappingSecondPass - 結果セットのマッピングのバインド: YourDTO

EclipseLink: そのログは見つかりませんでした。

マッピングに対するもう 1 つの注意事項:あいまいな型@ColumnResultには withを使用します。type

@ColumnResult(name = "article_publish_date", type=Calendar.class)
@ColumnResult(name = "article_id", type=BigInteger.class)
于 2014-10-16T08:10:35.167 に答える