Объекты в моем наборе результатов прикладываются к «Объекту» вместо того, что я указал в объектах @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. Однако правильная информация содержится в объектах.
ли ваш '@ SqlResultSetMapping' ставится на' CommentInfoListItemDTO'? Если да, то положите его на (любой) класс @ @ Entity, чтобы поставщик JPA мог его забрать. – zbig
Я не помещал @SqlResultSetMapping в CommentInfoListItemDTO. Я редактировал свой вопрос, чтобы показать, что я добавил его к существующей сущности. Тем временем я создам представление базы данных и создаю для этого сущность. Я просто хочу, чтобы облегчить вес, чтобы сделать соединение, чтобы вернуть информацию, которая мне нужна. Я не всегда хочу возвращать каждый бит информации из объединенных таблиц, чтобы представить его пользователю ... всего несколько столбцов. Нелегкое определение простого объекта результатов запроса в объекте. Просто расстроен. Любопытно узнать, чувствуют ли другие те же отношения. – BillR
Ваше обоснование для DTO отлично. – zbig