我在架构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上的本机查询的经验,然后是访问数据库的用户?请帮助:)
答案 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>
)
然后,使用链接名称引用远程数据库上的对象:
SELECT * FROM MV_ULICE@mylink
答案 1 :(得分:1)
好的,问题的真正解决方案是实际使用我误导性说不起作用的解决方案。
我花了很多时间来发现我的错误,但是使用标准符号SCHEMA.TABLENAME可以说明问题很长。所以在我的情况下,查询应该像这样开始:
final String queryString = "SELECT * "
+ "FROM ADRESY.MV_ULICE streets "
答案 2 :(得分:0)
“此用户有权访问 模式ADRESY“
中的表
在单个架构对象上授予权限,而不是整个架构。我怀疑您连接的用户没有此特定表/视图的权限。