我在模式ADRESY中有表MV_ULICE。但是,在JPA中,我使用ADRESY之外的其他用户连接到数据库(Oracle)。该用户有权从架构ADRESY访问表,因此在JPA中定义实体没有问题,因为您可以轻松地在实体定义中提供不同的架构:

@Entity
@Table(name = "MV_ULICE", schema = "ADRESY")
public class PoiStreet {
...


当我想使用JPA创建本机查询时,问题就开始了。查询看起来像这样:

final String queryString = "SELECT * "
                + "FROM MV_ULICE streets "
                + "WHERE CONNECT_BY_ISLEAF = 1 AND streets.status != 'H' "
                + "CONNECT BY NOCYCLE PRIOR streets.sym_ul = streets.symulold "
                + "START WITH streets.sym_ul = 'ulica'";

Query query = getEntityManager().createNativeQuery(
                queryString, poi.domain.entities.streets.PoiStreet.class);


这是行不通的。我只是从Oracle“表或视图不存在”中获取异常表。

我尝试将MV_ULICE更改为ADRESY.MV_ULICE

final String queryString = "SELECT * "
                + "FROM ADRESY.MV_ULICE streets " + ...


但这没有帮助。

那么,有人在使用不同模式的oracle上进行本机查询,然后又有访问数据库的用户有经验吗?请帮忙 :)

最佳答案

我不知道这是否是最好的解决方案,但我认为数据库链接会起作用。

首先,连接到“第一个”数据库并在SQL提示符下执行以下操作:

CREATE DATABASE LINK mylink CONNECT TO scott IDENTIFIED BY tiger USING '(DESCRIPTION = (ADDRESS =
(PROTOCOL = TCP) (HOST = <hostname>)(PORT = <port>)) (CONNECT_DATA = (SID = <SID>)))'


哪里

mylink      Name of the link.
<hostname>  host name where the database is installed
<port>      TNS listener port of the database
<SID>       database name


该语句创建一个名为“ mylink”的数据库链接。该链接连接到主机中安装的数据库的SCOTT用户(<hostname>

然后,使用链接名称引用远程数据库上的对象:

SELECT * FROM MV_ULICE@mylink

07-26 07:11