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

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查询。



 类似资料:
  • 问题内容: 我正在为Magento(1.6)商店开发类别汇总报告。 为此,我想获得一部分产品的“订单项”集合-这些产品的唯一类别ID(这是我创建的Magento产品属性)与特定值匹配。 我可以通过基于目录/产品的集合来获得相关的结果集。 Magento不喜欢它,因为有相同商品ID的重复条目。 如何根据订单项构建代码以获取此结果集?加入按属性过滤的产品集合使我难以理解。这段代码并不能解决问题,因为它

  • 问题内容: 我有一个 和 我想过滤掉那些不在赛场上的球员。 我知道如何在Java 8之前的Vanilla中执行此操作 我正在尝试使用Lambda表达式编写此简单的代码,但是我正在努力在过滤器中工作 这不会编译。 “无法解决方法getUsername()” 问题答案: 您将lambda表达式放在错误的位置-整个参数应该是lambda表达式。换句话说,“给一个玩家,我应该过滤还是不过滤?”

  • 问题内容: 我想问一下是否有可能使用hibernate方式做到这一点。假设我已经运行了HQL并检索了一个集合。是否可以使用hibernate进一步过滤它? 我试图在标头类中使用,并在查询之前添加session.enable(),但似乎无法正常工作。 样例代码 精简HQL 问题答案: 不。至少不是您问的方式。一旦您要求Hibernate(使用方法)访问数据库,Hibernate就发挥了作用,结果现在

  • 我有一个简单的可编辑的JComboBox,当您键入时,它过滤可用的选择。除了一些奇怪的情况外,它几乎可以工作,例如,当你键入“Sass”时,它将可用的选择过滤到一个“Sassi di Matera”,但如果你选择它,它将选择“Arte ruprestre della Vacamonica”,它碰巧是原始模型的第[0]项,而不是过滤后的模型的第[0]项。 我试着调试了几个小时,但似乎是一些奇怪的up

  • 有没有办法把这两条流合并成一条?我使用第一个流在嵌套列表中进行过滤和查找,并使用第二个流根据流的结果创建地图。我想知道是否有一种方法可以用一条流来实现这一点。 像这样的

  • 问题内容: 如果我有一个带有对象作为属性值的复杂对象,如何按嵌套的属性之一进行过滤? 可以使用OOB ng-repeat过滤器完成此操作吗? 数据 ngRepeat 问题答案: 您需要传入参数以过滤: 柱塞示例