在休眠中创建 SQL 列名创建SQlquery 结果

2022-09-01 22:17:44

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

我有机会做一些像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' 方法返回自定义对象。


答案 2

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

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

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

或者,可以使用哪个返回列名称。为了提高效率,我可能会构建一个别名来索引,然后你可以做类似的事情。query.getReturnAliasesString[]Mapresult[map.get("column name")]

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


推荐