Вопрос уроженца JPA для предприятия с наследованием

У меня есть класс предприятия и подкласс на основе того предприятия:

@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 изменяется.

Мой вопрос: Как я могу подвергнуть сомнению использование хранимой процедуры по предприятию, которому определили наследование на нем?

10
задан AnthonyF 26 January 2010 в 16:54
поделиться

1 ответ

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, если добавить или удалить некоторые.

10
ответ дан 4 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: