在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子句来扩展查询。
这有可能吗?
答案 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
的行我没有尝试映射 - 它应该只是说明你应该去的方式。