Отношение наследования таблиц на подклассы: Как выполнить запрос к классу Parent без загрузки подкласса ??? (Спящий режим) - PullRequest
7 голосов
/ 23 апреля 2010

Предположим, что Таблица для каждого подкласса наследует отношение , которое можно описать ниже (из wikibooks.org - см. здесь )

Уведомление Родительский класс не является абстрактным

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Project {

    @Id
    private long id;

    // Other properties

}

@Entity
@Table(name="LARGEPROJECT")
public class LargeProject extends Project {

    private BigDecimal budget;

}

@Entity
@Table(name="SMALLPROJECT")
public class SmallProject extends Project {

}

У меня есть сценарий , где мне просто нужно получить родительский класс . Из-за проблем с производительностью, Что я должен сделать , чтобы выполнить запрос HQL , чтобы получить класс Parent и просто класс Parent без загрузки какого-либо подкласса?

Ответы [ 3 ]

7 голосов
/ 10 июня 2010

Обходной путь описан ниже:

Определите ваш Parent класс как MappedSuperClass . Давайте предположим, что родительский класс сопоставлен с PARENT_TABLE

@MappedSuperClass
public abstract class AbstractParent implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @Column(table="PARENT_TABLE")        
    private String someProperty;

    // getter's and setter's

}

Для каждого подкласса расширьте класс AbstractParent и определите его SecondaryTable . Любое постоянное поле, определенное в родительском классе, будет сопоставлено с таблицей, определенной как SecondaryTable . И, наконец, используйте AttributeOverrides, если необходимо

@Entity
@SecondaryTable("PARENT_TABLE")
public class Child extends AbstractParent {

    private String childField;

    public String getChildProperty() {
        return childField;
    }

}

И определить другую сущность с целью получения только родительского класса

@Entity
@Table(name="PARENT_TABLE")
@AttributeOverrides({
    @AttributeOverride(name="someProperty", column=@Column(name="someProperty"))
})
public class Parent extends AbstractParent {}

Ничего другого. Смотрите, как показано выше, я использовал только аннотации JPA

4 голосов
/ 23 апреля 2010

Обновление: Похоже, первый вариант не работает, как я думал.

Первый вариант:

Укажите класс в предложении where:

select p from Project p where p.class = Project 

Второй вариант:

Использовать явный полиморфизм, который можно установить с помощью аннотации @Entity Hibernate:

@javax.persistence.Entity
@org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
@Inheritance(strategy = InheritanceType.JOINED)
public class Project {

    @Id
    private long id;
    ...
}

Это то, что в документации Hibernate Core написано о явномполиморфизм :

Неявный полиморфизм означает, что экземпляры класса будут возвращены запросом, который называет любой суперкласс или реализованный интерфейс или класс, и что экземпляры любого подкласса класса будут возвращеныпо запросу, который называет сам класс.Явный полиморфизм означает, что экземпляры классов будут возвращаться только запросами, которые явно называют этот класс.

См. Также

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

На самом деле, есть способ получить только суперкласс, вам просто нужно использовать собственный запрос от JPA, в моем случае я использую репозитории JPA, это будет что-то вроде этого:

@Query(value = "SELECT * FROM project", nativeQuery = true)
List<Resource> findAllProject();

Флаг nativeQuery как true позволяет запускать собственный SQL для базы данных.

Если вы используете Entity Manager, проверьте это: https://www.thoughts -on-java.org / jpa-native-query /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...