带有多个实体查找器的常见Spring JPA存储库



我的应用程序具有超过250个表,每个表具有ID和名称列。我试图用Hibernate 5 将我们的应用程序从Hibernate 3迁移到JPA 4.3。

在我当前的冬眠层中,我有(选项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;
    }
}

现在如何在JPA中实现这一目标。因此,如果我需要通过ID获得10个不同的实体,我不想初始化10个存储库,我想拥有一个存储库,我可以使用一个存储库来获取我想要的任何我想要的ByID或byname或byidandname的实体。我可以使用JDBCTEMPLATE轻松完成此操作,但这意味着可能不会通过JPA/Hibernate Caching机制跟踪它。

因此,如何在一个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);
}

您应该能够创建具有共同属性的超级类,将其标记为@mappedsuperclass,并为该超级类创建一个@norepositoryBean的存储库。您只需要做一些铸造即可。请参阅此答案

最新更新