如何使用Spring Data JPA按实体类名从表中获取数据

时间:2016-09-24 11:07:57

标签: spring spring-data-jpa

我有一个基本实体类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但这不适合我的情况,因为我在运行时只有实体类的名称,并且不知道如何为类创建动态存储库。

1 个答案:

答案 0 :(得分:1)

您可以编写自己的animation-play-state实现来实现此目的。

  

第1步:存储库注册表

JpaRepository
  

第2步:自定义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); } } 实施以填充注册表

JpaRepository

您必须调整配置才能使用自定义实现。有关详细信息,请参见Spring Data JPA文档。

  

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

@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);
  }
}