在hibernate createSQlquery结果中使用sql列名

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

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

 Query query=session.createSQLQuery("your query"); query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); List> aliasToValueMapList=query.list(); 

正如您可以从代码中找到的那样,该列表包含表示每行的Map对象。 每个Map对象都将列名作为键,值作为值。

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

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

上述评论中陈述的方法:

  query.getReturnAliases() 

实际上对我不起作用:

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

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

我遇到了同样的问题,但是当我使用这个查询查询= session.createSQLQuery(“你的查询”)时它解决了; query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);

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