2011-11-21 43 views
2

我有以下類別:休眠:使用標準與集合(HashSet的)

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,消除不良記錄?
  • 它甚至有可能與標準?
  • 如果不是另一種方式?

編輯。我發現這段代碼:

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

但我不明白它究竟做了什麼。 Whats resultTransformer?

請任何建議或提示會幫助這麼多!謝謝!

+1

所以,你想創建一個好的文件在黃色文件夾列表,.... **或**你想列出所有的他們並刪除**壞**條目?你真的想實現什麼? –

+0

感謝您的回答。我想先做,但如果不可能的話,第二。 – bunnyjesse112

回答

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

感謝您的回答!我有問題'c.add(Restrictions.propertyEq(「clipFolder.id」,aliasOfFolder +「.id」); c.add(Restrictions.like(「owner.name」,searchingName); '由...引起:java .sql.SQLException:no such column:owner1_.name – bunnyjesse112

+0

您必須在name屬性的映射中遇到問題。 –