【问题标题】:JPA Native Query to tables from different schema in OracleJPA 本机查询来自 Oracle 中不同模式的表
【发布时间】:2011-01-14 01:50:53
【问题描述】:

我在架构 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 上进行本机查询,然后是访问数据库的用户?请帮忙:)

【问题讨论】:

  • 你能把跨模式逻辑抽象到一个视图中,这样你就只是从“你的”模式访问一个视图吗?
  • 您使用哪种实现方式?
  • rok:我使用 Hibernate 作为 JPA 提供程序。 davek:我告诉你的那些表实际上已经是视图

标签: java oracle jpa


【解决方案1】:

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

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

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

【讨论】:

  • ?解决办法是什么 ?您的答案中粘贴的查询字符串提取物和问题相同?
【解决方案2】:

"此用户有权限访问 来自架构 ADRESY 的表”

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

【讨论】:

    【解决方案3】:

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

    首先,连接到您的“第一个”数据库并在 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用户(&lt;hostname&gt;

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

    SELECT * FROM MV_ULICE@mylink
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-11
      • 2021-11-01
      • 2013-06-07
      • 2017-05-13
      • 1970-01-01
      • 2019-10-18
      • 2018-08-03
      • 1970-01-01
      相关资源
      最近更新 更多