Spring JPA跨不同模式查询同一个表

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 { ... } 或者,是否有方法将限定表名传递到命名查询中?似乎不是,因为这似乎

我正在对Oracle数据库使用SpringJPA,我希望能够跨两个不同的模式/数据库(例如,db1.car和db2.car)查询相同的表

我的域对象将是相当标准的,如下所示。如果假设我有一个db1.car表和一个and db2.car表,有没有办法通过控制器将schema/db限定符传递给域对象

@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 {
    [...]
}