将 hibernate 投影结果映射到 java POJO 模型

2024-04-20

在过去的几周里,我一直在使用 spring 和 hibernate,并且我一直在那里学习新的东西。

现在我有一个问题想用 Hibernate 中的投影来解决。

假设有一个模型Person这个模型有很多Car。以下是类定义的大致样子:

public class Person implements java.io.Serializable {
    private Integer id;
    private String name;
    private List<Car> cars;
    private Integer minYear; // Transient
    private Integer maxYear; // Transient
}

public class Car implements java.io.Serializable {
    private Integer id;
    private Integer year;
}

这里的问题是我想得到minYear (maxYear) 每个Person由最早年份(最近年份)填写cars他们有。

后来我找到了一个解决方案可以使用Projections但我偶然发现org.hibernate.QueryException: could not resolve property: minYear of: model.Person这是数据库操作的代码:

Criteria criteria = sessionFactory.getCurrentSession().createCriteria("model.Person");
            criteria.add(create(personInstance));
            criteria.createAlias("minYear", "minYear");
            criteria.setProjection(Projections.min("cars.year").as("minYear"));

无论如何,是否可以使用瞬态方法存储聚合值Projections因为我只是想尽可能避免使用普通 SQL 和 HQL。


没关系,我已经找到解决方案了。

  1. 首先我们需要像这样创建关联对象的别名

    Criteria criteria = sessionFactory.getCurrentSession().createCriteria("model.Person");
    criteria.createAlias("cars", "cars");
    
  2. 使用 Hibernate Projections 选择所需的

    ProjectionList projections = Projections.projectionList();
    projections.add(Projections.property("id").as("id"));
    projections.add(Projections.property("name").as("name"));
    projections.add(Projections.property("cars").as("cars"));
    
  3. 根据根实体对结果进行分组(在本例中使用其 id,Person.id),这在与聚合一起使用以对聚合进行分组时尤其需要

    projections.add(Projections.groupProperty("id"));
    
  4. 使用聚合函数

    projections.add(Projections.min("cars.year").as("minYear"));
    projections.add(Projections.max("cars.year").as("maxYear"));
    
  5. 设置投影

    criteria.setProjection(projections);
    
  6. 使用结果转换器AliasToBeanResultTransformer将结果字段(如步骤 2 和 4 中指定)映射到 POJO

    criteria.setResultTransformer(new AliasToBeanResultTransformer(Person.class));
    
  7. 得到结果

    List<Person> results = (List<Person>) criteria.list();
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 hibernate 投影结果映射到 java POJO 模型 的相关文章

随机推荐

  • 以下哪种脚本语言更适合笔测试? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 首先 我想避免语言上的激烈争论 可供选择的语言有 Perl Python 和 Ruby 我想说的是 我对所有这些都感到满意 但问题是我不能只专注
  • 2次API调用响应后执行代码

    您好 我正在进行两个 API 调用来进行一些检查 我想在两个调用完成后执行代码 var firstCall request get first function error response body body JSON parse bod
  • C# 外壳扩展

    在 NET 中创建 shell 扩展还有比这更简单的方法吗 http www theserverside net tt articles showarticle tss id ShellExtensions http www theserv
  • 如何从文本中提取 URL

    如何在 Ruby 中从纯文本文件中提取所有 URL 我尝试了一些库 但在某些情况下它们会失败 最好的办法是什么 如果您喜欢使用 Ruby 中已提供的功能 require uri URI extract text here http foo
  • 如何在 Swift 中永远重复动画(HUGE_VALF)?

    根据文档 永久重复 CABasicAnimation 的方法是设置其repeatCount to HUGE VALF 但在斯威夫特中 HUGE VALF导致编译错误 Swift 似乎不知道标准库 或者这个常量所在的地方 现在我该怎么做 Se
  • 作为 JavaFX 应用程序启动屏幕的图像不会自动隐藏

    我有一个简单的 png 图像文件 我希望在加载 JavaFX 应用程序时显示该文件 我使用 NetBeans 作为 IDE 并且我知道可以像这样添加启动屏幕 项目属性 gt 运行 gt VM 选项 splash path to image
  • 如果磁盘可用空间很少,如何优化 9GB 表?

    我在 12GB 磁盘上有一个 9GB myisam 表 有 5MB 可用空间 我如何optimize桌子 问题是OPTIMIZE通过将整个表复制到一个新文件来工作 因此我需要 9GB 的可用空间才能成功 我能想到的唯一解决方案是 停止在桌子
  • 使用正则表达式验证英国邮政编码

    我想用英国邮政编码验证字段 可以使用什么正则表达式来验证该字段 A Z 1 2 0 9 0 9A Z 0 1 0 9 A Z 2 GIR 0AA 确实显得有效 因为它有例外GIR 0AA 所以 请帮我写一个没有任何异常的表达式 如果你指的是
  • 如何注册新的payum支付方式并添加操作?

    我创建了一个 payum 付款方式 我设置了一个存储付款详细信息的付款表单 然后生成付款安全令牌 到目前为止 一切似乎都正常 payum 会在存储中生成令牌 但是 我似乎无法注册它 我不知道应该在哪里添加操作 以便在加载付款方式时使用它们
  • 如何同时循环多个数组(并行)

    好吧 我不知道为什么这这么难 我找到的所有信息仅适用于像 array combine 这样的两个数组 我有 3 个从表单中动态创建的输入字段获取的数组 所以现在我想检索数据并将其打印出来 如下所示 Item1 array1 Item1 ar
  • 如何在 Flutter 中对文本的 fontSize 进行动画处理?

    有什么方法可以动画增加 减少fontSize in a Text widget 可能更简单的解决方案是使用AnimatedTextStyle double size 10 override Widget build BuildContext
  • 如何将 HTML 代码导入到 JSF 页面?

    我正在尝试导入这个page http dl dropbox com u 5714646 Highcharts 2 2 0 examples pie donut index htm到我的 JSF 页面 该页面将有数据库来获取数据 以更具交互性
  • Rabl、Jbuilder 或手动 json 构建 api?

    要为大规模应用程序构建 api 就性能而言 哪种方法更好 我应该使用 Rabl Jbuilder 还是手动构建 json 对象 我正在为移动应用程序构建 api endpoints 在性能方面 您应该尝试创建一些基本的性能测试 并对它们进行
  • 无法在同一查询中运行 Insert 和 Select LAST_INSERT_ID() 吗?

    我正在使用节点连接到 mysql 我需要运行插入 然后立即运行 select last insert id insert into data temp values null test id 12 otherdata x otherdata
  • OpenCV(C++/Qt)-cornerSubPix 错误

    Hello 我在使用 imgproc hpp 文件中的cornerSubPix 方法时遇到问题 我不明白缺少哪个库或者有什么错误 我在 OS X 10 10 3 上使用 Qt 5 4 1 并使用 OpenCV 3 0 0 C 库 这是我的代
  • 在 PHP 的 require_once 中使用查询字符串

    在我的其中一个页面上有一个require once path to url page php 没有任何问题 当我添加查询字符串时require once path to url page php var test 它将不再包含该文件 只是一
  • Web 应用程序的计划任务

    为 Web 应用程序创建计划任务 无论是否有单独的 Web 桌面应用程序 有哪些不同的方法 如果我们谈论的是 Microsoft 平台 那么我总是会开发一个单独的 Windows 服务来处理此类批处理任务 您始终可以引用 Web 应用程序正
  • 无法在 Scala 中使用 Apache Commons CLI Option.builder()

    在 Spark shell 或应用程序 用 Scala maven 构建编写 中 我无法使用 Apache Commons CLI 包中的静态构建器方法 我已确认我将 jar 包含在类路径中并且可以访问Option类以及包中的其他类 例如O
  • 我可以将 jQuery UI 对话框置于 div 中心吗?

    我有一个主要内容 div 我想将对话框置于该 div 的中心 而不是页面的中心 有任何想法吗 我知道有一个位置实用程序 但我不知道如何将它与对话框位置选项一起使用 你是对的 position http jqueryui com demos
  • 将 hibernate 投影结果映射到 java POJO 模型

    在过去的几周里 我一直在使用 spring 和 hibernate 并且我一直在那里学习新的东西 现在我有一个问题想用 Hibernate 中的投影来解决 假设有一个模型Person这个模型有很多Car 以下是类定义的大致样子 public