我的应用程序有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); }
您应该能够创建具有公共属性的超类,将其标记为@MappedSuperClass,并将该超类的存储库创建为@NoRepositoryBean。您只需要对结果进行一些转换即可。