gpt4 book ai didi

java - 使用 Spring Data JPA 在 HQL 中继承

转载 作者:行者123 更新时间:2023-11-30 07:28:32 24 4
gpt4 key购买 nike

我有一组继承自单个父类(super class)的类:

   Super
|
+------+-------+
Aaaa Bbbb Cccc

Aaaa、Bbbb、Cccc 中的每一个都应该包含方法 findByTag。问题是我无法笼统地定义它。以下示例为 Aaaa 定义了特定的 findByTag。

public interface AaaaRepository extends SuperRepository<Aaaa> {
@Query("select distinct a from Aaaa a " +
"join a.tags t " +
"join fetch a.locale where t = ?1")
public List<Event> findByTag(Tag t);
}

请注意,父类(super class)是@MappedSuperclass,在数据库中没有自己的表。

我想在查询中使用某种“ super ”,它会在每个类中被其名称替换。

我的第二个问题是我不知道如何强制 Eagerly 获取 @ElementCollection。我必须始终在查询中明确地说“join fetch”。如果未获取,一旦事务完成,我将无法访问那些我未明确获取的对象。 (LazyFetch 异常...)

谢谢

最佳答案

查看 documentation ,自定义实现部分,这种方法怎么样:

  1. 创建一个扩展存储库并具有您的 findByTag 方法的接口(interface),不带注释。
  2. 创建该类的实现,并在方法实现中使用 JPA 标准。您还需要一个类字段来保存域对象的实际类,因为泛型在编译时会被删除。然后您使用该字段来构建标准。
  3. 阅读文档以将此实现用作存储库工厂的基类,然后 Spring Data 将基于此自定义存储库为其他存储库构建实现。

    public interface MyRepository<T, ID> extends JpaRepository<T, ID> {        
    public List<Event> findByTag(Tag t);
    }

    public class MyRepositoryImpl<T, ID> implements MyRepository<T, ID> {

    private Class<T> actualClass; // initialized in the constructor

    public List<Event> findByTag(Tag t) {
    // here you build the criteria using actualClass field, and execute it.
    }
    }

    public interface AaaaRepository extends MyRepository <Aaaa, Integer> {
    // other methods...
    }

查看文档的“Example 1.16. Custom repository factory bean”以创建工厂 bean。

当Spring实例化AaaaRepository的实现时,它会使用MyRepositoryImpl作为基类。

这对你有用吗?

关于java - 使用 Spring Data JPA 在 HQL 中继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9141416/

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