该应用程序使用Spring和Hibernate。
在Java中执行sql查询之前是否可以更改dblink?无论是原生JDBC还是Hibernate?
我知道可以
通过附加@dblink来引用其他数据库上的表或视图 表或视图名称
但我无法做到这一点,因为sql查询是由用户编写的,我无法控制它(解析它太复杂了。)
上面的代码显示了我尝试做的事情......
// TODO connect to the db link ???
List<Object> results = this.getSession().doReturningWork(new ReturningWork<Object>(){
@Override
public String execute(Connection connection) throws SQLException
{
final ResultSet rs = connection.createStatement().executeQuery(userQuery);
// doing something with results....
}
});
答案 0 :(得分:2)
您可以在模式中创建引用其他数据库上的表的同义词:
CREATE OR REPLACE SYNONYM "SOURCE_SCHEMA"."SYNONYM_NAME" FOR "TARGET_SCHEMA"."TARGET_TABLE"@"DBLINK"
这样您就可以通过同义词名称访问外部表,从而使您远离对象的确切物理位置:
SELECT * FROM SYNONYM_NAME
如果你想使用Hibernate映射这个实体,你可以像使用任何其他对象一样使用同义词名称。
答案 1 :(得分:0)
如果查询中的所有引用都是通过DB链接或完全限定的,那么您可以这样做:
私有数据库链接优先于同名的公共数据库链接,或者私有数据库链接显然会使用当前用户的链接。
答案 2 :(得分:0)
我只是初始化一个到dblink的新连接。由于用户名是唯一的,因此可以使用。
final Configuration configuration = new Configuration();
configuration.setProperty("hibernate.connection.url", jdbcUrl);
configuration.setProperty("hibernate.connection.username", userDbLinkName);
configuration.setProperty("hibernate.connection.password", userDbLinkPassword);
final StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
final SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());
return sessionFactory.openSession();