Собственный запрос JPA к таблицам из другой схемы в Oracle - PullRequest
2 голосов
/ 07 февраля 2010

У меня есть таблица MV_ULICE в схеме ADRESY. Однако в JPA я подключаюсь к базе данных (Oracle), используя другого пользователя, чем ADRESY. Этот пользователь имеет право доступа к таблицам из схемы 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 с различными схемами, чем у пользователя, который обращается к базе данных? Пожалуйста, помогите:)

Ответы [ 3 ]

1 голос
/ 14 февраля 2010

Хорошо, таким образом, реальное решение проблемы состоит в том, чтобы фактически использовать решение, которое, как я ошибочно сказал, не работает.

Я потратил достаточно времени, чтобы найти свою ошибку, но, говоря коротко, используя стандартную запись SCHEMA.TABLENAME, сработает. Так что в моем случае запрос должен начинаться так:

final String queryString = "SELECT * "
                + "FROM ADRESY.MV_ULICE streets "
1 голос
/ 07 февраля 2010

Я не знаю, является ли это лучшим решением, но я думаю, что ссылка на базу данных будет работать.

Сначала подключитесь к своей «первой» базе данных и выполните в командной строке 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
0 голосов
/ 08 февраля 2010

"Этот пользователь имеет право доступа таблицы из схемы ADRESY "

Права предоставляются отдельным объектам схемы, а не всей схеме. Я подозреваю, что пользователь, к которому вы подключаетесь, не имеет привилегий для этой конкретной таблицы / представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...