【问题标题】:How to get data from a table by entity class name using Spring Data JPA如何使用 Spring Data JPA 通过实体类名从表中获取数据
【发布时间】:2016-09-24 11:07:56
【问题描述】:

我有一个基实体类BaseDictionary

@Entity
@Inheritance
public abstract class BaseDictionary {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @Column(name = "code")
    protected String code;

    @Column(name = "is_enabled")
    protected Boolean enabled = true;
}

任何子类

@Entity
@Table(name = DB.DIC_RIGHTS_TYPE, schema = DB.SCHEMA_DIC)
public class DicRightsType extends BaseDictionary {}

@Entity
@Table(name = DB.DIC_ROLES_TYPE, schema = DB.SCHEMA_DIC)
public class DicRolesType extends BaseDictionary {}

有很多这样的子类。

给定一个像DicRightsType 这样的实体类名称,我想从与该名称的实体关联的表中获取数据。怎么可能实现?

我想像这样使用 JPA 存储库:Using generics in Spring Data JPA repositories 但这不适合我的情况,因为我在运行时只有实体类的名称,并且不知道如何为该类创建动态存储库。

【问题讨论】:

    标签: spring spring-data-jpa


    【解决方案1】:

    您可以编写自己的 JpaRepository 实现来实现这一点。

    第 1 步:存储库注册表

    class RepositoryRegistrar {
      private static final Map<Class<T>, Repository<T, Serializable>> DICTIONARY = new HashMap<>();
    
      public static void register(Class<T> entityClass, Repository<T, Serializable> repository) {
        DICTIONARY.put(entityClass, repository);
      }
    
      public static Repository<T, Serializable> get(Class<T> entityClass) {
        return DICTIONARY.get(entityClass);
      }
    }
    

    第 2 步:自定义 JpaRepository 实现以填充注册表

    @NoRepositoryBean
    class RegisteringJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> {
      public RegisteringJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {{
        super(entityInformation, entityManager);
    
        RepositoryRegistrar.register(entityInformation.getJavaType(), this);
      }
    }
    

    您必须调整配置以使用您的自定义实现。 Spring Data JPA 文档中提供了这方面的详细信息。

    第 3 步:从注册商处获取存储库引用

    Repository<?, ?> getRepository(String entityClassName) {
      return RepositoryRegistrar.get(Class.forName(entityClassName));
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 2021-06-08
      • 1970-01-01
      • 2019-07-26
      • 2014-10-17
      • 2023-03-19
      • 2020-05-16
      • 1970-01-01
      • 2018-11-10
      相关资源
      最近更新 更多