我正在使用Hibernate进行数据库连接。我的用户有权获取open_mode(从v $ database中选择open_mode)。 我想使用现有的hibernate数据库配置在hibernate中执行查询另外我不想在我的java文件中创建JDBC连接代码,如下所示
String url = "jdbc:oracle:thin:@192.179.9.31:1521:db1";
Connection conn = DriverManager.getConnection(url,"user","password");
Statement stmt = conn.createStatement();
ResultSet rs;
rs = stmt.executeQuery("select openmode from v$database");
while ( rs.next() ) {
String lastName = rs.getString("openmode");
由于这个v $数据库不是我们模式中的真实表,我想我们不能为v $ database创建实体类并使用hql执行查询。
任何人如何使用我现有的配置执行上述查询并获得结果。
这是我的hibernate配置细节。
<property name="dialect"> org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.url"> jdbc:oracle:thin:@192.179.9.31:1521:db1
</property>
<property name="connection.username">user</property>
<property name="connection.password">passsword</property>
<property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver
</property>
<property name="myeclipse.connection.profile"> Oracle 9i Connector
</property>
答案 0 :(得分:0)
您可以在Hibernate中为没有映射实体的表创建本机查询。 像往常一样创建一个hibernate会话,然后在下面的代码片段中创建本机查询。
String sqlQuery = "select openmode from v$database";
Query q = session.createNativeQuery(sqlQuery);
List<Object[]> listResults = query.getResultList();
这将返回数组列表。您需要遍历此列表并将输出解析为域中的任何POJO。
this page提供了一个示例。
您还可以将此方法的重载版本用于与表映射的实体,以利用数据库特定功能,例如hints
或CONNECT BY
。
<强>更新强>
OP尝试的另一种方法是使用createSQLQuery
。标量用于映射具有Hibernate类型的列。
String sqlQuery = "select open_mode from v$database";
SQLQuery query = session.createSQLQuery(sqlQuery).addScalar("open_mode", Hibernate.STRING);
List result = q.list();
String open_mode = result.get(0).toString();
答案 1 :(得分:0)
您可以使用session.doWork(...)方法。
这是为了允许用户使用此Session管理的Connection执行与JDBC相关的工作。
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
//Perform JDBC statement, resultset etc here.
}
});