Hibernate: использование критериев с коллекциями (HashSet) - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть следующие классы:

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

  public class Clip{
      private Owner owner;
  }

Мне нужно найти список красивых документов в желтых папках, которые имеют владельцев из клипов в этих папках , чьи имена подобны строке поиска.Примерно так (не работает):

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, удалив неправильные записи?
  • Возможно ли это даже с критериями?*
  • Если нет, то как по другому?

edit.Я нашел этот фрагмент кода:

    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");
}

, но я не могу понять, что именно он делает.Каков результатTransformer?

Пожалуйста, любые советы или подсказки очень помогли бы!Спасибо!

1 Ответ

2 голосов
/ 23 ноября 2011
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"));
}
...