Spring Data Repository查询钩子

时间:2015-11-25 19:11:13

标签: spring spring-data

在Spring Data中是否可以扩展由repo接口的find *函数生成的查询?

给出以下用例:

我的遗留数据库按表继承。所以给出以下

@Entity public class Person { 
  private int id;
  private String className;
}

@Entity @PrimaryKeyJoinColumn(name="id") public class Musician extends Person {
  String instrument;
}

@Entity @PrimaryKeyJoinColumn(name="id") public class Lawyer extends Person {
  String discipline;
}

我的音乐人资料库:

public interface MusicianRepository extends CrudRepository<Musician, int> {
  List<Musician> findAll();
}

现在SQL中新音乐家的条目是:

insert into Person(id, className) values(1, 'Musician');
insert into Musician(id, instrument) values(1, 'piano');

当音乐家迁移到律师时,旧系统在没有移除音乐家的情况下向Lawyer表添加了一行:

insert into Lawyer(id, discipline),  values(1, 'finance');
update Person set ClassName = 'Lawyer' where ID = 1;

My MusicianRepo现在可以找到律师,因为Musician中的那一行仍然存在。

我需要某种后处理器,我可以通过在所有find *方法上添加带有“ClassName ='Musician'”的where子句来扩展查询。

这有可能吗?

1 个答案:

答案 0 :(得分:1)

我认为你的JPA映射在继承方面是不正确的。

我想你想要“加入,多表继承”

引自here

  

加入继承是最合乎逻辑的继承解决方案,因为它   镜像数据模型中的对象模型。在连接继承中   table是为要存储的继承层次结构中的每个类定义的   只有该类的本地属性。层次结构中的每个表   还必须存储对象的id(主键),该id仅定义   在根类中。层次结构中的所有类必须共享相同的ID   属性。鉴别器列用于确定哪个类   特定行属于,层次结构中的每个类都定义自己的行   唯一的鉴别器价值。

     

一些JPA提供程序支持带或不带连接的继承   鉴别器列,一些需要鉴别器列,还有一些   不支持鉴别器列。所以加入继承确实如此   似乎还没有完全标准化。

Person中的className列将是您的descriminator列。它确定要实例化的子类。

您的映射将是这样的:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="className")
public class Person { 
      private int id;
      private String className;
    }

@Entity
@DiscriminatorValue("Musician")
 public class Musician extends Person {
      String instrument;
    }

    @Entity
@DiscriminatorValue("Lawyer")
 public class Lawyer extends Person {
      String discipline;
    }

这样,如果查询Lawyer实体,JPA会自动添加where子句,只读取className = Lawyer

的行

我没有尝试映射 - 它应该只是说明你应该去的方式。