2010-02-07 3 views
2

У меня есть таблица MV_ULICE в схеме ADRESY. Однако в JPA я подключаюсь к базе данных (Oracle) с использованием другого пользователя, а затем ADRESY. Этот пользователь имеет привилегию доступ к таблицам из схемы ADRESY, поэтому в JPA не было никаких проблем с определением сущности, так как вы можете легко представить другую схему в определении сущности:JPA Собственный запрос к таблицам из другой схемы в Oracle

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

Проблема началась, когда я хотел создать Native Query используя 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 «Таблица или представление не существует».

Я попытался chanign MV_ULICE к ADRESY.MV_ULICE

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

, но это не помогло.

У кого-нибудь есть опыт работы с собственными запросами на оракуле с разными схемами, а затем с пользователем, который обращается к базе данных? Пожалуйста, помогите :)

+0

Можете ли вы абстрагировать логику перекрестной схемы в виде, так что вы просто получаете доступ к виду из «вашей» схемы? – davek

+1

какой осуществление вы используете? – rochb

+0

rok: Я использую Hibernate как поставщик JPA. davek: Те таблицы, о которых я вам говорил, уже есть на самом деле –

ответ

1

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

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

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

? Каково решение ? Вложенная строка строки запроса в вашем ответе и вопрос идентичны? –

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. Ссылка подключается к пользователю SCOTT базы данных, установленной на хосте (<hostname>)

Затем используйте имя ссылки для ссылки на объект на удаленной базе данных:

SELECT * FROM [email protected] 
0

«Этот пользователь имеет привилегию для доступа таблицы из схемы ADRESY»

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

Смежные вопросы