在hibernate createSQlquery结果中使用sql列名

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 的全部价值。

【讨论】:

以上是关于在hibernate createSQlquery结果中使用sql列名的主要内容,如果未能解决你的问题,请参考以下文章

在hibernate createSQlquery结果中使用sql列名

hibernate createSQLQuery返回处理

Hibernate使用createSqlQuery进行模糊查询时找不到数据

hibernate session.createSQLQuery(sql); 通过命令删除

不推荐使用 Hibernate 5.2.5.Final createSQLQuery() 方法

createSQLQuery is not valid without active transaction解决方法