我在模式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