2014-10-15 4 views
2

Объекты в моем наборе результатов прикладываются к «Объекту» вместо того, что я указал в объектах @SQLResultSetMapping.JPA 2.1 ConstructorResult Causing ClassCastException

Я пытаюсь получить дескриптор на ConstructorResult и создал запрос, который содержит простое соединение, и я пытаюсь получить набор результатов и цикл, хотя он распечатывает его, чтобы убедиться, что я прав. Однако, когда я добираюсь до петли, похоже, что это должно быть прямолинейно.

Когда я объявляю список результатов, он отличен от типа. Я прохожу через класс теста запросов, и он успешно запускает запрос и загружает его в результат, но элементы в списке результатов набираются как объекты Object, а не объекты 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 - Я попытался добавить типы данных в список столбцов в сопоставлении. Это не помогло. Каждая запись в наборе результатов по-прежнему отображается в java.lang.Object где-то внутри Hibernate, и это не позволит мне вернуть его обратно в DTO. Resultsetmapping в настоящее время связан Hibernate:

INFO: Binding отображение ResultSet: 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 { 
... 

POJO

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

И, наконец, Screengrab из отладчика, показывающий результирующий как объекты а не объекты CommentInfoListItemDTO. Однако правильная информация содержится в объектах.

And finally a screengrab from the debugger showing the resultset as Objects rather than CommentInfoListItemDTO objects.

+0

ли ваш '@ SqlResultSetMapping' ставится на' CommentInfoListItemDTO'? Если да, то положите его на (любой) класс @ @ Entity, чтобы поставщик JPA мог его забрать. – zbig

+0

Я не помещал @SqlResultSetMapping в CommentInfoListItemDTO. Я редактировал свой вопрос, чтобы показать, что я добавил его к существующей сущности. Тем временем я создам представление базы данных и создаю для этого сущность. Я просто хочу, чтобы облегчить вес, чтобы сделать соединение, чтобы вернуть информацию, которая мне нужна. Я не всегда хочу возвращать каждый бит информации из объединенных таблиц, чтобы представить его пользователю ... всего несколько столбцов. Нелегкое определение простого объекта результатов запроса в объекте. Просто расстроен. Любопытно узнать, чувствуют ли другие те же отношения. – BillR

+0

Ваше обоснование для DTO отлично. – zbig

ответ

0

java.lang.ClassCastException: [Ljava.lang.Object; не может быть приведен к YourDTO

выбрасывается, когда EclipseLink не может найти имя YourDTO передаваемое в

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

за исключением брошенной Hibernate в аналогичной ситуации:

org.hibernate.MappingException: Unknown SqlResultSetMapping [someNonExistingMappingName] 

Вы должны убедиться, что YourDTO зарегистрирован поставщиком услуг постоянного доступа. Как? Наблюдайте журналы:

Hibernate:

DEBUG аннотаций.ResultsetMappingSecondPass - Binding набор результатов отображения: YourDTO

EclipseLink: я не нашел каких-либо журналов для этого.

Еще одно замечание к вашему отображения: Использование @ColumnResult с type для неоднозначных типов:

@ColumnResult(name = "article_publish_date", type=Calendar.class) 
@ColumnResult(name = "article_id", type=BigInteger.class) 
+0

. Спасибо, что проверил журналы и явным образом листинг списка результатов столбца. Использование Hibernate 4.3.6. Я хотел использовать Eclipselink, когда я начал эту штуку год назад, но я использую PostgreSQL, и Eclipselink не играл так же хорошо, как Hibernate. – BillR

+0

Задайте типы переменных, как вы предполагали, но все равно не повезло. Также Hibernate нашел POJO. "INFO: Отображение набора привязок: CommentInfoListItemDTOMapping" Я ввел это как ошибку с Hibernate. Тем временем я могу просто начать использовать MyBatis для этих типов запросов. Это намного более прямолинейно, как только конфигурация будет выполнена. – BillR

+0

Ошибка, которую я подал в Hibernate, была связана кем-то с существующей ошибкой. Так может быть и так. Hibernate ORM HHH-9445 JPA 2.1 ConstructorResult Причинение ClassCastException https://hibernate.atlassian.net/browse/HHH-9445 – BillR

Смежные вопросы