【问题标题】:Execute Normal SQL Query in Hibernate在 Hibernate 中执行普通 SQL 查询
【发布时间】:2018-08-25 01:01:42
【问题描述】:

我正在使用 Hibernate 进行数据库连接。我的用户有权获得 open_mode(从 v$database 中选择 open_mode)。 我想使用现有的hibernate DB配置在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$database 不是我们架构中的真实表,我认为我们不能为 v$database 创建实体类并使用 hql 执行查询。

任何人都可以如何执行上述查询并使用我现有的配置获得结果。

这是我的休眠配置详细信息。

<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> 

【问题讨论】:

    标签: java oracle hibernate


    【解决方案1】:

    您可以在 Hibernate 中为没有映射实体的表创建本机查询。 像往常一样创建一个休眠会话,然后在 sn-p 下方创建本机查询。

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

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

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

    【讨论】:

    • 我尝试过如下执行(从 createNativeQuery 开始)... String sqlQuery = "select open_mode from v$database"; SQLQuery q = session.createSQLQuery(sqlQuery);列表 列表结果 =q.list();但是我收到错误-> org.hibernate.QueryException: addEntity() 或 addScalar() 必须在执行查询之前在 sql 查询上调用。 [从 v$database 中选择 open_mode]
    • 检查此答案以了解此异常stackoverflow.com/a/22573096/3503187
    • 它工作..谢谢这是工作代码.. String sqlQuery = "select open_mode from v$database"; SQLQuery q = session.createSQLQuery(sqlQuery).addScalar("open_mode", Hibernate.STRING);列表 aa = q.list(); String open_mode = aa.get(0).toString();
    • 酷。您可以将此标记为答案。我将修改答案以使用createSQLQuery
    【解决方案2】:

    您可以使用session.doWork(...) 方法。

    这是为了允许用户使用由这个 Session 管理的 Connection 来执行 JDBC 相关的工作。

        session.doWork(new Work() {
            @Override
            public void execute(Connection connection) throws SQLException {
                //Perform JDBC statement, resultset etc here.
            }
    
        });
    

    【讨论】:

    • 我的 Hibernate 目前正在进行连接配置。我想重用休眠连接来执行普通 Sql。你能就此提出建议吗?
    • 使用休眠配置你可以获得Session,就像你让它与其他entities交互一样。一旦你从hibernate得到Session,你就可以使用上面的doWork(...)方法。这样您就不需要使用 DriverManager api、连接 url 等打开新连接,您将使用通过休眠配置创建的休眠会话中的连接。还是我误解了你的问题?
    • 这个 doWork 是否只适用于某些特定的休眠版本? org.hibernate.jdbc.Work 和 ReturningWork。她的就是我的密码。私有配置配置=新配置();私有静态 org.hibernate.SessionFactory sessionFactory; sessionFactory = configuration.buildSessionFactory();会话会话 = (会话) threadLocal.get();会话 = (sessionFactory != null) ? sessionFactory.openSession() : null;但是 doWork 出错 --> Session 类型的方法 doWork(new Work(){}) 未定义
    • 您使用的是哪个版本的休眠?你能告诉我你用于 doWork(...) 方法的代码吗,希望你已经导入了import org.hibernate.jdbc.Work;
    • 是的,我已经导入了 --> import org.hibernate.jdbc.ReturningWork;并导入 org.hibernate.jdbc.Work;这是我的代码。会话 s =sessionFactory.openSession(); s.beginTransaction(); s.doWork(new Work() { public void execute(Connection conn) throws SQLException { PreparedStatement pStmt = null; try { String sqlQry = "select open_mode from v$database"; pStmt = conn.prepareStatement(sqlQry);} finally { pStmt.close();} } }); s.getTransaction().commit(); }
    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 2014-06-18
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多