当前位置: 首页 > 面试题库 >

Hibernate Criteria API-筛选集合属性

萧和平
2023-03-14
问题内容

我有这样的实体:

@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,我想通过过滤的Picturs获得唯一的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的图片数量只有四行,但是在“相册”中,我获取了所有图片。

我也尝试了其他ResultTransformers,但最终得到了很多结果(4),但并没有区别。

我想念或做错了什么?


问题答案:

您不能通过在查询中包括对集合的限制来筛选与实体关联的集合的内容。该查询将仅获取相册。访问集合后,可以稍后获取集合的内容。您要做的就是过滤相册,以仅检索包含带有事件ID的图片的相册。

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

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



 类似资料:
  • 在新的Laravel资源类中,您可以根据自己喜欢的任何内容删除属性。 如果您想返回许多项目,您可以使用该功能 但这不允许您在一个位置添加元数据。输入一个集合,太好了,这是一个很好的格式,能够添加元数据的许多项目。但是,您不能做的是筛选集合,您必须像使用资源一样隐藏属性。我能看到的唯一办法就是 我是不是错过了什么?对于资源收集来说,这似乎是一个被忽视的巨大能力

  • 我有以下问题:我正在学习如何使用MongoDb和C#。可以在集合中插入项,但无法筛选现有集合以检索一个或多个符合查询条件的项。下面是我的类结构: 下面是我保存对象的方法: 并且正确保存了对象,正如您在图像中所看到的: 但是如何检索包含id为1234的对象事务的文档呢? 我使用的是.NET Core2和MongoDb C#驱动程序版本2.5。 编辑:集合是BsonDocument集合,它不是Tran

  • 基本上,我希望使用过滤泛型(扩展集合),然后返回相同泛型集合实现的实例(最好是新实例),例如实现方法签名。 null null null 修改原始列表

  • 我的集合视图具有覆盖功能: 此功能使单元格高度根据单元格内内容的高度而动态变化,同时保持宽度为电话屏幕的静态宽度。这个函数完全按照我想要的方式工作。 我遇到的问题是这个函数只在视图加载时被调用,我希望它在我调用时也能运行。所以当我调用时,单元格会关闭其,而不是上面函数中的大小。 有人知道我在调用时如何允许此函数运行吗?

  • 我需要筛选此查询,以便不显示值为的文档。当前,我的代码显示以下结果: 我需要一些过滤器,使消失,以便它显示我作为第一个值:。 我以前执行过以下操作:

  • 设备类型。Java语言 elemetry.java枚举类 我想获取所有DeviceType Id,其DeviceTeletry名称以“System”(字符串)开头。 我做了这样的事情:- 有谁能告诉我如何从中获取DeviceType Id吗?