Hibernate JPA проблема не применяется IS-A Отношения таблицы в некоторых случаях - PullRequest
0 голосов
/ 04 мая 2018

У меня есть родительская таблица A и расширенные дочерние таблицы B и C

например:

public class A {
private Long id;
//getters setters//
}

public class B extends A{
 private String name;
//getters setters//
}

сейчас в моем хранилище,

public interface B extends JpaRepository<B, Long> {
@Query("select a from A a")//--This works
B getAll()

@Query("select a.id, b.name from A a join a.B b")//-- This doesn't
B getSpecificCols()
}

Мне нужно объяснение, так как "B - это A", поэтому getAll () работает почему getSpecificCols () не работает?

Ошибка

java.lang.ClassCastException: java.lang.Long cannot be cast to <package>.B

Кстати, я использую Hibernate Spring

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

После прочтения документации все, что мне было нужно, - это поместить конструкторы в мою сущность / таблицу, где вы указали, какие конкретные параметры вам нужны.

0 голосов
/ 04 мая 2018

Запрос возвращает long (a.id) и строку (b.name). Интерфейс предполагает, что вы возвращаете сущность (B). Возвращенный идентификатор не может быть преобразован в B, поэтому вы получаете ClassCastException. Если вам нужны отдельные поля, вы можете вернуть List<Object[]>, где каждая запись будет массивом с идентификатором и именем. Или вы можете использовать проекцию (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections).

Кстати, первый запрос действительно работает, когда в базе данных есть объекты A, которые не являются объектами B, например, если A также имеет подкласс C? Кажется совершенно неправильным выбрать базовый класс и вернуть производный класс без фильтрации. Я бы выбрал из B, чтобы вернуть B.

...