【问题标题】:Using sql column names in hibernate createSQlquery result在hibernate createSQlquery结果中使用sql列名
【发布时间】:2011-02-06 00:24:31
【问题描述】:

我有几个要查询的带有复合主键的 sql 视图,并且由于 Hibernate 使得使用复合键很痛苦,所以我使用 createSQLQuery。问题是这个方法只能返回一个List,我需要通过索引来引用列。

我有没有机会做类似 jdbc 的事情并通过它们的 sql 名称而不是它们的索引来引用列?

【问题讨论】:

    标签: java sql hibernate jdbc


    【解决方案1】:
    Query query=session.createSQLQuery("your query");
    query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
    List<Map<String,Object>> aliasToValueMapList=query.list();
    

    从代码中可以看出,列表包含代表每一行的 Map 对象。每个 Map 对象都将列名作为键,将值作为值。

    注意:这适用于 SQLQuery,如果您在 hql 查询上使用 AliasToEntityMapResultTransformer 而不指定别名,您将获得索引值作为键。

    如果您再次将 aliasToValueMapList 转换为您的 POJO 列表,我建议您创建自己的 ResultTransformer 并从“transformTuple”方法返回您的自定义对象。

    【讨论】:

    • 顺便说一句,我有一个 sql 查询,格式为“从...中选择 table1.price 作为 price1”,由于某种原因,AliasToEntityMapResultTransformer 没有映射 price1。如果我“从...中选择(table1.price * 1)作为price1”,它可以工作。所以我想我在变压器中发现了一个错误..
    • 记得添加addScalar声明(例如query.addScalar("myAlias", IntegerType.INSTANCE))。否则,您可能会得到不正确的别名(例如转换为大写)或不正确的数据类型。
    • 不知何故我必须添加这个导入才能使其工作:import org.hibernate.transform.AliasToEntityMapResultTransformer
    【解决方案2】:

    您的问题模棱两可-在第一段中您想按索引引用列,在第二段中按 sql 名称引用。由于按索引很容易,我将按名称假设。

    首先,您可以使用doWork 方法来访问底层的JDBC 连接并像使用纯JDBC 一样处理它:

    session.doWork(new Work() {
      public void execute(Connection connection) throws SQLException {
        connection.prepareStatement(...
      }
    });
    

    或者,您可以使用query.getReturnAliases,它返回列名的String[]。为了效率,我可能会构建一个别名为Map 的索引,然后你可以执行类似result[map.get("column name")] 的操作。

    但实际上,Hibernate 在使用 xml 映射时非常容易处理复合键(尚未尝试使用注释)。前面需要做更多的工作,并且存在一些复杂关系的问题(主要是当外键名称/跨度不匹配时),但是一旦您创建了 id 类并对其进行映射,您就可以坚持使用 HQL/标准 并获得延迟加载、简单连接、脏检查等的所有好处。

    【讨论】:

    • @Brian,谢谢!是的,我的意思是按名称访问,而不是索引;)@Adi,是的,这就是我想要的答案,谢谢!
    【解决方案3】:

    我遇到了同样的问题,但是当我使用这个时它解决了

    Query query=session.createSQLQuery("your query");
    query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
    

    我得到带有标题名称的结果,但是当我在 sql 查询中创建一个新列时遇到了一个新问题 从 Employee.class 中选择“DCA5E3”作为 Shipmentcolor 但在这种情况下,我得到了 SHIPMENTCOLOR:“D”。 如何获得 SHIPMENTCOLOR 的全部价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-01
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多