小编典典

具有多个实体查找器的通用Spring JPA存储库

spring-boot

我的应用程序有250多个表,每个表都有ID和name列。我正在尝试将我们的应用程序从hibernate3迁移到带有hibernate5+的Spring-JPA 4.3。

在我当前的hibernate层中,我有(选项1):

public class DAO
{
    private Session session;

    public DAO(Session session)
    {
        this.session=session;
    }

    public EntityA findById(String id)
    {
        //implementation
        return entityA;
    }
    public EntityB findByName(String name)
    {
        //implementation
        return entityB;
    }
    public EntityC findByIdAndName(String id, String name)
    {
        //implementation
        return entityC;
    }
}

过去我可以使用更通用的方法来完成以下工作,但是如果我有10个要通过ID提取的不同实体,我就不想重新初始化此类。

public class DAO<T>
{
    public T findById(String id)
    {
        //implementation
        return T;
    }
    public T findByName(String name)
    {
        //implementation
        return T;
    }
    public T findByIdAndName(String id, String name)
    {
        //implementation
        return T;
    }
}

现在如何在Spring-
JPA中实现这一目标。因此,如果我需要通过ID获取10个不同的实体,我不想初始化10个存储库,那么我想拥有一个存储库,我可以使用该存储库来获取我想要的所有实体,这些实体需要byId或byName或byIDAndName。我可以使用JdbcTemplate轻松做到这一点,但这意味着JPA
/hibernate缓存机制可能无法跟踪它。

因此,如何在一个JPA存储库中执行以下操作:

{
    @Query("from EntityA where id=?1")
    EntityA findEntityAById(String id);

    @Query("from EntityB where name=?1")
    EntityB findEntityBById(String name);

    @Query("from EntityC where id=?1 and name=?2")
    EntityC findEntityCById(String id,String name);
}

阅读 337

收藏
2020-05-30

共1个答案

小编典典

您应该能够创建具有公共属性的超类,将其标记为@MappedSuperClass,并将该超类的存储库创建为@NoRepositoryBean。您只需要对结果进行一些转换即可。

2020-05-30