【问题标题】:hibernate SQLquery extract variable休眠 SQLquery 提取变量
【发布时间】:2011-03-27 00:31:47
【问题描述】:

如何从休眠 SQL 查询中提取变量 total、min、max 并将它们分配给 java 变量?

(select count(*) as total, min(price) as min, max(price) as max from product).addScalar("total", Hibernate.INTEGER).addScalar("min", Hibernate.INTEGER).addScalar("max", Hibernate.INTEGER);

【问题讨论】:

    标签: java hibernate orm


    【解决方案1】:

    This 的帖子应该对你有所帮助。

    后期编辑:

    String sQuery = "select min(myEntity.x), max(myEntity.y) from MyEntity myEntity";
    Query hQuery = session.createQuery(sQuery);
    List result = hQuery.list();
    
    Iterator iterator = result.iterator();
    
    while (iterator.hasNext()) {
        Object[] row = (Object[])iterator.next();
        for (int col = 0; col < row.length; col++) {
            System.out.println(row[col]);
        }
    }
    

    【讨论】:

    • 我希望能够从 SQL 查询中提取变量,如果可能的话,不使用条件。
    【解决方案2】:

    标量查询返回 ListObject 数组 (Object[]) - 或者在您的情况下返回单个 Object[]

    但是,可以使用ResultTransformer 返回非托管实体。引用Hibernate 3.2: Transformers for HQL and SQL 博文:

    SQL Transformers

    使用原生 sql 返回非实体 bean 或 Map 通常更有用 而不是基本的Object[]。和 现在的结果变压器 可能。

    List resultWithAliasedBean = s.createSQLQuery(
      "SELECT st.name as studentName, co.description as courseDescription " +
      "FROM Enrolment e " +
      "INNER JOIN Student st on e.studentId=st.studentId " +
      "INNER JOIN Course co on e.courseCode=co.courseCode")
      .addScalar("studentName")
      .addScalar("courseDescription")
      .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
      .list();
    
    StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);
    

    提示:addScalar() 调用是 在 HSQLDB 上需要使其匹配 属性名称,因为它返回列 全部大写的名称(例如 “学生姓名”)。这也可能是 用一个定制的变压器解决了 搜索属性名称而不是 使用完全匹配——也许我们应该 提供一个fuzzyAliasToBean() 方法 ;)

    另见

    【讨论】:

    • 从来不知道 resultTransformers。现在,我将坚持使用 Object[]。但是,应该如何测试上述查询?我讨厌将它发布到服务器运行它并计时。是否有工具可以让您在不部署到本地服务器的情况下对其进行测试?
    • @Nishant 您可以在 Java SE 环境(例如测试用例)中运行 Hibernate。一些 IDE 还提供 HQL/Criteria 编辑器(例如 Eclipse 中的 Hibernate Tools)。
    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2021-03-31
    • 2013-12-04
    相关资源
    最近更新 更多