在Hibernate中执行普通SQL查询

时间:2018-03-16 03:19:25

标签: java oracle hibernate

我正在使用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> 

2 个答案:

答案 0 :(得分:0)

您可以在Hibernate中为没有映射实体的表创建本机查询。 像往常一样创建一个hibernate会话,然后在下面的代码片段中创建本机查询。

String sqlQuery = "select openmode from v$database";
Query q = session.createNativeQuery(sqlQuery);
List<Object[]> listResults = query.getResultList();

这将返回数组列表。您需要遍历此列表并将输出解析为域中的任何POJO。

this page提供了一个示例。 您还可以将此方法的重载版本用于与表映射的实体,以利用数据库特定功能,例如hintsCONNECT 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.
        }

    });