JPA Native查询来自Oracle中不同模式的表

时间:2010-02-07 12:24:18

标签: java oracle jpa

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

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

当我想使用JPA创建Native Query时,问题就出现了。查询如下所示:

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上的本机查询的经验,然后是访问数据库的用户?请帮助:)

3 个答案:

答案 0 :(得分:1)

我不知道这是否是最佳解决方案,但我认为数据库链接可行。

首先,连接到“第一个”数据库并在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”的数据库链接。该链接连接到主机(<hostname>

中安装的数据库的SCOTT用户

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

SELECT * FROM MV_ULICE@mylink

答案 1 :(得分:1)

好的,问题的真正解决方案是实际使用我误导性说不起作用的解决方案。

我花了很多时间来发现我的错误,但是使用标准符号SCHEMA.TABLENAME可以说明问题很长。所以在我的情况下,查询应该像这样开始:

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

答案 2 :(得分:0)

  

“此用户有权访问   模式ADRESY“

中的表

在单个架构对象上授予权限,而不是整个架构。我怀疑您连接的用户没有此特定表/视图的权限。

相关问题