Hibernate Criteria API - 过滤集合属性

2023-12-01

我有这样的实体:

@Entity
public class Album {

    private Integer id;
    private Integer ownerId;
    private String name;
    private String description;
    private Date created;
    @OneToMany @JoinColumn(name = "albumId")
    private Set<AlbumUser> users = new HashSet<AlbumUser>();
    @OneToMany @JoinColumn(name = "albumId")
    private Set<Picture> pictures = new HashSet<Picture>();
}

另一个:

@Entity
public class Picture {

    private Integer id;
    private Integer creatorId;
    private Integer albumId;
    private Date created;
    private String title;
    private String description; 
    @ManyToOne @JoinColumn(name = "eventId")
    private Event event;
}

使用 Criteria API,我想获得带有过滤图片集的独特 AlbumD。我尝试这样的事情:

public Album read(Integer albumId, Set<Integer> picFilter) {
        Criteria crit = getCurrentSession().createCriteria(Album.class, "album");
        crit.add(Restrictions.idEq(albumId));
        if (picFilter != null && !picFilter.isEmpty()) {
            crit = crit.createAlias("album.pictures", "picture");
            crit.add(Restrictions.in("picture.event.id", picFilter));
            crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);   
        }       
        Album resultDs = (Album) crit.uniqueResult();       
        return resultDs;
}

在这里我得到了包含所有相关图片的相册。它们根本没有被过滤。 当我尝试执行记录器打印的查询时,我只得到四行,即具有给定 eventId 的图片数量,但在相册中我得到了所有图片。

我还尝试了其他结果转换器,但最终得到了许多结果(4)而不是不同的结果。

我错过了什么或做错了什么?


您无法通过在查询中包含对集合的限制来过滤与实体关联的集合的内容。该查询只会获取相册。当集合被访问时,可以稍后获取集合的内容。您要做的就是过滤相册以仅检索包含具有事件 ID 的图片的相册。

如果集合仅包含与您的条件匹配的图片,并且您将获得部分集合,则会导致更新问题,因为 Hibernate 会认为过滤的项目已被删除,并会更新数据库以反映该更改,实际上会删除这些项目来自收藏。

如果您只想接收收藏中的某些项目,您可以使用Session.createFilter()方法。唯一的问题是,它目前仅支持 HQL 查询。

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

Hibernate Criteria API - 过滤集合属性 的相关文章

随机推荐

  • 更改 Xcode 项目的单一语言

    如何在不进行本地化的情况下更改项目使用的默认语言 如果我希望我的应用程序是日语或意大利语怎么办 仅使用日语或意大利语文本就足够了吗 如何更改 iTunes 上显示的语言 使其显示为日语或意大利语 通常 您放入主文件夹中的资源被假定位于Def
  • 通过AJAX将表单数据传递到mySQL

    我使用 JavaScript 和 AJAX 将表单数据发送到 php 处理文件 然后填充 SQL 数据库 而无需刷新初始表单页面 php SQL 连接正常 但表单数据未正确发送 有两个字段 一个称为 选择 的单选组 以及一个称为 评论 的文
  • 使用多个参数调用特征文件

    我想调用具有 3 个参数的功能文件 第一个参数用于创建具有该名称的实体 其余 2 个参数用于验证创建的实体是否具有特定字段所需的值 我怎样才能在空手道中做到这一点 您可以将所有输入保存在一个 JSON 中 并将其传递给您的功能 如本文档中所
  • 如何使用密码保护已有的 PDF?

    如何为现有的PDF设置密码 你有没有看过加密 pdf我书第12章中的例子 就这么简单 public void encryptPdf String src String dest throws IOException DocumentExce
  • SELECT TOP 1 返回多条记录

    我将在下面链接我的数据库 我有一个名为 TestMonday1 的查询 它的作用是返回 NoOfFrees 最少的学生 并将查询结果插入到课程表中 运行查询应该有助于解释我的意思 我遇到的问题是我的 SQL 代码有 SELECT TOP 1
  • 在多个页面上绘制

    我正在尝试编写一个绘制 ggplot 的函数facet wrap绘制多个页面 这只是一个 hack 因为这个功能似乎在 ggplot2 功能待办事项列表中 我做了一些小计算来找到我需要的页数 我的行数data frame我非常有信心这一切都
  • 在没有 pdfkit 的情况下将 Pandas DataFrame 保存为 PDF 文件格式

    我想将 pandas 数据框保存为 pdf 格式 import pdfkit as pdf config pdf configuration wkhtmltopdf C Program Files wkhtmltopdin wkhtmlto
  • XSLT - 不得复制节点值

    我想使用 XSLT 转换一些 xmi 文件 一切正常 但我不明白为什么标记值 Version 1 0 和 EAUML Version 1 0 由我的模板 packagedElement 复制 请参阅输出 xmi 文件
  • SQL Server GUID 排序算法。为什么?

    唯一标识符的问题 我们有一个现有的数据库 它广泛使用唯一标识符 不幸的是 作为主键和一些表的一些可为空的列 我们遇到过这样的情况 在这些表上运行的一些报告对这些唯一标识符进行排序 因为表中没有其他列可以提供有意义的排序 这不是很讽刺吗 目的
  • 从 ID 列表中删除 mysql 服务器中的行 C#

    我正在尝试从 C 中的 ID 列表中删除 MySQL 表中的一系列行 表中有一个employeeID 行 基本上我的问题是我会使用什么样的语法 你可能会使用IN你的条款DELETE DELETE FROM EmployeeTable WHE
  • 如何使用 getUsermedia 和 mediaRecorder 下载录音并给出视频规格?

    navigator mediaDevices getUserMedia then stream gt a recorder is created var mediaRecorder new MediaRecorder stream star
  • 如何使用netty在单独的线程池中执行业务逻辑处理程序

    我有一个需要执行一些业务逻辑的处理程序 我希望它在单独的线程池中执行 以免阻塞 io 事件循环 我已将 DefaultEventExecutorGroup 添加到管道中 如中指定的http netty io 4 0 api io netty
  • 使用 pandas 和 matplotlib 绘制分类数据

    我有一个包含分类数据的数据框 colour direction 1 red up 2 blue up 3 green down 4 red left 5 red right 6 yellow down 7 blue down 我想生成一些图
  • 如何在 Android 上自动播放 HTML5 mp4 视频?

    我通过asp net开发了一个移动页面来播放mp4视频 我知道 iOS 已禁用自动播放功能以最大限度地减少用户带宽 那么我该如何 在 Android 上自动播放 HTML5 mp4 视频 我已经在 HTML5 代码中添加了自动播放功能 但它
  • Grails ApplicationContext.xml grailsResourceLoader

    我正在尝试让一个项目在 Tomcat7 上运行 该项目需要一些插件并且是用 Grails 编写的 使用命令创建 warGrails 产品战争结果没有错误 但是 如果我将应用程序添加到 Tomcat7 服务器 它就不会被执行 我的 tomca
  • 将三角形带转换为三角形?

    我正在使用 GPC 曲面细分库 它输出三角形条 该示例显示的渲染如下 for s 0 s lt tri num strips s glBegin GL TRIANGLE STRIP for v 0 v lt tri strip s num
  • 如何将某些内容记录到 Zend Developer Tools 工具栏?

    是否可以将 ZF2 控制器中的某些变量记录到 Zend Developer Tools 工具栏 好吧 我在 ZendDevelopersTool 上创建了一个 Collector 来添加个人信息 你需要来自控制器的信息 而这是我从未尝试过的
  • 我们可以在 Android MotionLayout 的同一个 中使用 OnSwipe 和 OnClick 吗?

    我想在用户时播放动画clicks or swipes 但是我们可以在 MotionLayout 中处理这两种行为吗 它们可以完美地分开工作 但如果我添加OnClick and OnSwipe在同一场景中 仅OnClick作品 有什么解决方法
  • 配置 spring-boot-starter-oauth2-client 以使用 Azure AD 进行身份验证

    我想在 Spring Boot 2 4 中添加 Azure AD 作为 OAuth2 提供程序 我跟着Spring Boot 的 OAuth2 文档并提出以下配置 spring security oauth2 client provider
  • Hibernate Criteria API - 过滤集合属性

    我有这样的实体 Entity public class Album private Integer id private Integer ownerId private String name private String descript