Spring JPA跨不同模式查询同一个表
我正在对Oracle数据库使用SpringJPA,我希望能够跨两个不同的模式/数据库(例如,db1.car和db2.car)查询相同的表 我的域对象将是相当标准的,如下所示。如果假设我有一个db1.car表和一个and db2.car表,有没有办法通过控制器将schema/db限定符传递给域对象Spring JPA跨不同模式查询同一个表,spring,oracle,jpa,Spring,Oracle,Jpa,我正在对Oracle数据库使用SpringJPA,我希望能够跨两个不同的模式/数据库(例如,db1.car和db2.car)查询相同的表 我的域对象将是相当标准的,如下所示。如果假设我有一个db1.car表和一个and db2.car表,有没有办法通过控制器将schema/db限定符传递给域对象 @Entity @Table(name = "car") public class Car { ... } 或者,是否有方法将限定表名传递到命名查询中?似乎不是,因为这似乎
@Entity
@Table(name = "car")
public class Car {
...
}
或者,是否有方法将限定表名传递到命名查询中?似乎不是,因为这似乎不起作用(即“:qualifiedcar”导致弹簧自动接线错误):
public interface CarRepository扩展了JpaRepository{
@查询(“选择p from:qualifiedcar p其中p.type in(:type)”)
列表由qualifiedpersonandType(@Param(“qualifiedcar”)字符串qualifiedcar、@Param(“type”)字符串类型)查找;
}
为了澄清这一点,也许Oracle没有使用术语schema。将它们称为不同的数据库可能更准确。要在实体中指定模式,您必须按如下方式执行:
@Entity
@Table(name = "car", schema = "db1")
public class CarS1 {
...
}
@Entity
@Table(name = "car", schema = "db2")
public class CarS2 {
...
}
String dinamicQuery = "Select * from ";
String resultMapping = "";
if (schema.equals("db1")){
dinamicQuery = dinamicQuery + "table1 ";
resultMapping = "test1"
}else{
dinamicQuery = dinamicQuery + "table2 ";
resultMapping = "test2"
}
Query q = em.createNativeQuery(dinamicQuery,resultMapping);
em.getEntityManagerFactory().addNamedQuery("selectDinamic", q);
return em.createNamedQuery("selectDinamic",Piloto.class).getResultList();
关于第二个问题,我将尝试使用编程命名查询,如下所示:
@Entity
@Table(name = "car", schema = "db1")
public class CarS1 {
...
}
@Entity
@Table(name = "car", schema = "db2")
public class CarS2 {
...
}
String dinamicQuery = "Select * from ";
String resultMapping = "";
if (schema.equals("db1")){
dinamicQuery = dinamicQuery + "table1 ";
resultMapping = "test1"
}else{
dinamicQuery = dinamicQuery + "table2 ";
resultMapping = "test2"
}
Query q = em.createNativeQuery(dinamicQuery,resultMapping);
em.getEntityManagerFactory().addNamedQuery("selectDinamic", q);
return em.createNamedQuery("selectDinamic",Piloto.class).getResultList();
resultMapping在实体中定义,是在查询中格式化对象所必需的
@SqlResultSetMappings({
@SqlResultSetMapping(name="test1",
classes = {
@ConstructorResult(
targetClass = Cars1.class,
columns = {
@ColumnResult(name = "id", type = Long.class),
[...]
})
})
})
@Entity
@Table(name = "car", schema = "db1")
public class CarS1 {
[...]
}