首页 文章

Hibernate:使用带有集合的标准(HashSet)

提问于
浏览
2

我有以下课程:

public class Folder{
      private Set<Documents> documents;
      private Set<Clip> clips;
  }

  public class Clip{
      private Owner owner;
  }

我需要找到黄色 folders 中的 documents 列表,其中 clipsclipsclips ,其名称类似于搜索字符串 . 像这样的东西(不工作):

Criteria criteria = session.createCriteria(Document.class);

criteria.add(Restrictions.eq("isNice", 1));
criteria.createCriteria("folder").add(Restrictions.eq("isYellow", 1));
criteria.createCriteria("clips");
criteria.createCriteria("owner").add(Restrictions.like("name", search));

List documents = criteria.list();

如何为HashSet创建条件?要么

  • 也许我应该使用hql查询

  • 也许我只能编辑 List documents ,删除不良条目?

  • 甚至可以用标准吗?

  • 如果不是另一种方式?

编辑 . 我发现了这段代码:

List cats = sess.createCriteria(Cat.class)
    .createCriteria("kittens", "kt")
        .add( Restrictions.eq("name", "F%") )
    .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
    .list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
    Map map = (Map) iter.next();
    Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
    Cat kitten = (Cat) map.get("kt");
}

但我无法理解它究竟是做什么的 . 什么结果变形金刚?

请,任何建议或提示都会有所帮助!谢谢!

1 回答

  • 2
    Criteria criteria = session.createCriteria(Document.class, "document");
    criteria.add(Restrictions.eq("document.nice", true));
    criteria.createAlias("document.folder", "folder");
    criteria.add(Restrictions.eq("folder.yellow", true));
    criteria.add(Subqueries.exists(clipOwnerWithNameInFolder(name, "folder"));
    
    private DetachedCriteria clipOwnerWithName(String searchedName, String aliasOfFolder) {
        DetachedCriteria c = DetachedCriteria.forClass(Clip.class, "clip");
        c.createAlias("clip.owner", "owner");
        c.createAlias("clip.folder", "clipFolder");
        c.add(Restrictions.propertyEq("clipFolder.id", aliasOfFolder + ".id");
        c.add(Restrictions.like("owner.name", searchedName);
        c.setProjection(Projections.id());
    }
    

    这需要剪辑/文件夹关联是双向的(即你需要在 Clip 中有一个 folder 字段) . 如果不是这样的话,可以像这样创建分离的标准:

    private DetachedCriteria clipOwnerWithName(String searchedName, String aliasOfFolder) {
        DetachedCriteria c = DetachedCriteria.forClass(Folder.class, "clipFolder");
        c.createAlias("clipFolder.clips", "clip");
        c.createAlias("clip.owner", "owner");
        c.add(Restrictions.propertyEq("clipFolder.id", aliasOfFolder + ".id");
        c.add(Restrictions.like("owner.name", searchedName);
        c.setProjection(Projections.property("clip.id"));
    }
    

相关问题