我有几个我想要查询的复合主键的sql视图,而且由于Hibernate使用复合键很难,我使用的是createSQLQuery
。问题是这个方法只能返回一个List,我需要通过索引来引用colums。
我有可能做一些像jdbc这样的事情并用他们的sql名称而不是索引来引用列吗?
答案 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的全部价值。