gpt4 book ai didi

java - 搜索从@MappedSuperclass 扩展的所有表

转载 作者:行者123 更新时间:2023-12-04 08:09:58 27 4
gpt4 key购买 nike

我在搜索从@MappedSuperclass 扩展的实体时遇到了问题。我创建了一个类 PhoneBook 并从中扩展了 2 个实体:FirstPhoneBook 和 SecondPhoneBook。结构如下所示:

@MappedSuperclass
public abstract class PhoneBook {
...

@Entity
@Table(name = "first_phone_book")
public class FirstPhoneBook extends PhoneBook {
...

@Entity
@Table(name = "second_phone_book")
public class SecondPhoneBook extends PhoneBook {
...

这些表绝对相似。我描述了 PhoneBook 类中的所有字段,子类中只有默认构造函数。外部系统发送电话号码作为参数。根据表格是否包含此类数字,我的系统会用一个词进行响应。

问题是:如何在不对每个子类名称进行硬编码的情况下,在从@MappedSuperclass 扩展的每个表中单独搜索?

我只能找到这样的按值搜索的变体:

currentSession.get(Employee.class, theId);

但是有对实体类的显式调用。我希望它是可扩展的,而不需要为每个添加的新实体编写新的 DAO。当前方法签名如下所示:

public <T extends PhoneBook> T findByNumber(String number);

最佳答案

您描述的是多态查询,即引用父类的查询。 Hibernate documentation说这在使用 @MappedSuperclass 继承时没有得到很好的支持:

Because the @MappedSuperclass inheritance model is not mirrored at the database level, it’s not possible to use polymorphic queries referencing the @MappedSuperclass when fetching persistent objects by their base class.

如果经常使用多态查询,最好使用table per class继承策略:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class PhoneBook {
...

@Entity
@Table(name = "first_phone_book")
public class FirstPhoneBook extends PhoneBook {
...

@Entity
@Table(name = "second_phone_book")
public class SecondPhoneBook extends PhoneBook {
...

然后您可以使用父类(super class)获取实体:

PhoneBook phoneBook = currentSession.get(PhoneBook.class, theId);

Hibernate 通常会使用 UNION 对两个表进行查询。

也就是说,即使使用 @MapperSuperclass,Hibernate 仍然可以查询所有表以查找扩展父类的类。您可以使用以下 JPA 查询(请注意,它使用父类的完全限定类名):

Query<PhoneBook> query = currentSession.createQuery("from " + PhoneBook.class.getName() +
" where id = :id", PhoneBook.class);
query.setParameter("id", theId);

不同的是,这里查询的不是实体,而是扩展父类的所有类。同样在这种情况下,与每个类一个表的策略不同,Hibernate 不会使用 UNION,而是向每个表发送一个查询,在这种情况下是两个单独的 SQL 查询,而不是一个。

关于java - 搜索从@MappedSuperclass 扩展的所有表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66026613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com