在hibernate createSQlquery结果中使用sql列名

时间:2010-04-09 06:06:40

标签: java sql hibernate jdbc

我有几个我想要查询的复合主键的sql视图,而且由于Hibernate使用复合键很难,我使用的是createSQLQuery。问题是这个方法只能返回一个List,我需要通过索引来引用colums。

我有可能做一些像jdbc这样的事情并用他们的sql名称而不是索引来引用列吗?

4 个答案:

答案 0 :(得分:47)

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'方法返回自定义对象。

答案 1 :(得分:1)

您的问题含糊不清 - 在第一段中,您希望通过索引引用列,而在第二段中,通过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 /标准并获得延迟加载,简单连接,脏检查等所有好处。

答案 2 :(得分:1)

以上评论中陈述的方法:

 query.getReturnAliases()

实际上对我不起作用:

Caused by: java.lang.RuntimeException: SQL queries do not currently support returning aliases in query:

答案 3 :(得分:0)

我遇到了同样的问题但是当我使用这个

时它就解决了
Query query=session.createSQLQuery("your query");
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);

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