Hibernate Criteria API - Filtering collection property

前端 未结 4 1453
清歌不尽
清歌不尽 2021-01-01 04:56

I have such entity:

@Entity
public class Album {

    private Integer id;
    private Integer ownerId;
    private String name;
    private String descriptio         


        
相关标签:
4条回答
  • 2021-01-01 05:32

    You can not filter the content of Collections associated with an entity by including Restrictions on the Collection in the query. The query will only fetch the Albums. The content of the Collection can be fetched later, when the Collection is accessed. All you do is filter the Albums to retrieve only those Albums that contain the Pictures with the event ids.

    If the Collection would only contain the Pictures that match your Criteria and you would get a partial Collection it would cause problems on updates, because Hibernate then think the filtered items have been removed and would update the database to reflect that change, actually removing the items from the Collection.

    If you want to receive only some items from a Collection you can use the Session.createFilter() method. The only problem is, that it only supports HQL queries currently.

    0 讨论(0)
  • 2021-01-01 05:35

    If you use alias with left_join, it will return just sub object which satisfy related condition. Otherwise it returns main object which satisfy conditions but with all of sub object set.

    crit = crit.createAlias("album.pictures", "picture", CriteriaSpecification.LEFT_JOIN);
    

    This method is deprrecated in some hibernate version, if so you can use below solution for it too: criteria with filtered complex set

    0 讨论(0)
  • 2021-01-01 05:47

    I recall this being an issue for something I did recently. Have you tried this:

    if (picFilter != null && !picFilter.isEmpty()) {
        Criteria subCriteria = crit.createCriteria("album.pictures"); // Or just 'pictures?'
        Disjunction or = Restrictions.disjunction();
    
        for (Integer id : picFilter)
            or.add(Restrictions.idEq(id));
        subCriteria.add(or);
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
     }
    
    0 讨论(0)
  • 2021-01-01 05:49

    try this:

        Criteria crit = getCurrentSession().createCriteria(Album.class, "album");
        crit.add(Restrictions.idEq(albumId));
        if (picFilter != null && !picFilter.isEmpty()) {
            crit.createAlias("album.pictures", "picture");
            crit.createAlias("picture.event", "event");
            crit.add(Restrictions.in("event.id", picFilter));
            crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);   
        }     
    
    0 讨论(0)
提交回复
热议问题