У меня есть класс предприятия и подкласс на основе того предприятия:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class A
и
@Entity
public class B extends A
Я должен выпустить родной вопрос, который использует хранимую процедуру по базовому классу (A) только. Если я делаю попытку его следующим образом:
entityManager.createNativeQuery("select * from A a where procedure(f)",A.class).getResultList()
Я добираюсь, ошибка относительно «Колонки clazz_ не был найден в ResultSet». Я предполагаю, что поставщик JPA добавляет эту колонку, чтобы различить между базовым классом и расширенным классом. Я могу работать вокруг этой проблемы, явно добавляя clazz колонку и все области от подкласса:
entityManager.createNativeQuery("select *,1 as clazz_,null as prop1,null as prop2 from A a where procedure(f)",A.class).getResultList()
где «prop1» и «prop2» - свойства подкласса B. Однако это походит на ненужное хакерское проникновение и подвержено проблемам обслуживания, если подкласс B изменяется.
Мой вопрос: Как я могу подвергнуть сомнению использование хранимой процедуры по предприятию, которому определили наследование на нем?
public static long getFolderSize(File dir) {
long size = 0;
for (File file : dir.listFiles()) {
if (file.isFile()) {
System.out.println(file.getName() + " " + file.length());
size += file.length();
}
else
size += getFolderSize(file);
}
return size;
}
-121--747655- Как вы, вероятно, видели, команда Hibernate не приложила много усилий для определения того, как вы это делаете.. в документации просто указано:
16,1,6. Обработка наследования
Собственные запросы SQL, которые запрашивают объекты, которые сопоставлены как часть наследование должно включать все свойства базового класса и все его подклассы.
Поэтому, если вы хотите использовать запросы Native, похоже, вы застряли, делая что-то подобное. Что касается беспокойства по поводу изменения подкласса B, возможно, менее обременительным способом реализации этого было бы попробовать использовать синтаксис LEFT OUTER JOIN для свойства shared ID:
entityManager.createNativeQuery("select a.*, b*, 1 as clazz_, from A a LEFT OUTER JOIN B b on id = a.id where procedure(f)",A.class).getResultList()
Таким образом вы всегда получите все свойства из B, если добавить или удалить некоторые.