ClassCastException для запроса JPA, который пытается вернуть объект, запрошенный во внутреннем операторе SELECT.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 ClassCastException для запроса JPA, который пытается вернуть объект, запрошенный во внутреннем операторе SELECT.

Сообщение Anonymous »

У меня есть следующий запрос JPA, который пытается найти все дочерние объекты родительского объекта, подходящие под определенные условия, а затем получить только первый из них в разных разделах:

Код: Выделить всё

@Repository
public interface MyRepository {
@Query("SELECT sorted_children.child_1 " +
" FROM ( " +
"   SELECT child AS child_1, " +
"     ROW_NUMBER() OVER (PARTITION BY child.field2, child.parent.field2 " +
"       ORDER BY child.parent.field1 ASC) AS rowNum " +
"   FROM ChildObject child " +
"   WHERE child.field1 IN (?1) AND " +
"         child.parent.field1 IN (?2) " +
" ) AS sorted_children" +
" WHERE sorted_children.rowNum = 1")
Set findChildObjects(Set childField1, Set parentField1);
}
Но по какой-то причине я получаю следующую ошибку:

Код: Выделить всё

java.lang.ClassCastException: class org.hibernate.persister.entity.SingleTableEntityPersister cannot be cast to class org.hibernate.metamodel.mapping.EntityAssociationMapping
(org.hibernate.persister.entity.SingleTableEntityPersister and org.hibernate.metamodel.mapping.EntityAssociationMapping are in unnamed module of loader 'app')
Объекты Entity выглядят следующим образом.
Родитель:

Код: Выделить всё

@Entity
@Table(name = "parent_table", schema = "schema")
public class ParentObject {

@Id
@Column(name = "id")
public Long id;

@Column(name = "field1")
public Long field1;

@Column(name = "field2")
public String field2;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
public Set children;
}
Ребенок:

Код: Выделить всё

@Entity
@Table(name = "child_table", schema = "schema")
public class ChildObject {

@Id
@Column(name = "id")
public Long id;

@Column(name = "field1")
public Long field1;

@Column(name = "field2")
public String field2;

@ManyToOne
@JoinColumn(name = "parent_id", nullable = false, updatable = false)
public ParentObject parent;
}
Я пробовал несколько разных запросов, которые работают, но они не возвращают нужные мне результаты.
Пример №1 ( не первый и не разделенный):

Код: Выделить всё

@Query("SELECT child " +
"   FROM ChildObject child " +
"   WHERE child.field1 IN (?1)")
Set findChildObjects(Set field1);
Пример №2 (я получаю родительские объекты, а не дочерние):

Код: Выделить всё

@Query("SELECT sorted_children.parent " +
" FROM ( " +
"   SELECT child.parent AS parent, " +
"     ROW_NUMBER() OVER (PARTITION BY child.field2, child.parent.field2 " +
"       ORDER BY child.parent.field1 ASC) AS rowNum " +
"   FROM ChildObject child " +
"   WHERE child.field1 IN (?1) AND " +
"         child.parent.field1 IN (?2) " +
" ) AS sorted_children" +
" WHERE sorted_children.rowNum = 1")
Set
 findParentObjects(Set childField1, Set parentField1);
Я немного удивлен, что пример №2 работает, потому что он очень похож в том смысле, что оператор SELECT возвращает объект, найденный во внутреннем запросе (который я поймите, что внутри Hibernate он преобразуется в CTE (общее табличное выражение). Итак, я думаю, что с ChildObject нужно сделать что-то особенное, чтобы иметь возможность вернуть его как часть операции, поскольку в настоящее время он идентифицируется как SingleTableEntityPersister и Hibernate. ожидает EntityAssociationMapping.
Поэтому мой вопрос:
  • Что я делаю неправильно в своем исходный запрос для получения ClassCastException?
  • Как добиться успешного выполнения запроса?


Подробнее здесь: https://stackoverflow.com/questions/792 ... ed-in-an-i
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»