2012-07-17 72 views
2

在Hibernate中,是否有一種方法可以創建向Criterion對象添加別名。我有以下工作:休眠:標準。向標準對象添加別名

我有一個從大數據庫與許多表的動態搜索。該搜索有許多(25+)可選的非獨佔參數選擇clien-side。這需要使用Hibernate Criteria API來管理。在我的DAO,我有以下方法:

Public List<myPojoClass> getDataByCriterion(List<Criterion> restrictionList) { 
    Session s = HibernateUtil.currentSession(); 
    Criteria c = s.createCriteria(myPojo.class); 
    for (Criterion crit : restrictionList){  
     c.add(crit); 
    } 

List<myPojoClass> response = c.list(); 
return response; 
} 

我需要做一個myOtherPojo.class並加入想知道是否有可能以一個別名添加到標準列表上方。
財產以後這樣的:

restrictionsList.add(... ...createAlias("myOtherPojo.class" , "mop"); 

然後,我需要o增加其他邏輯和這一類如上。

回答

4

你又來了! ;)

你可以通過條目(如一個HashMap <字符串,字符串>的集合),並在它們之間迭代來填充你的別名......這樣的:

Public List<myPojoClass> getDataByCriterion(List<Criterion> restrictionList, HashMap<String,String> aliases) { 
Session s = HibernateUtil.currentSession(); 
Criteria c = s.createCriteria(myPojo.class); 
for (Criterion crit : restrictionList){  
    c.add(crit); 
} 
for (Entry<String, String> entry : aliases.entrySet()){ 
    c.createAlias(entry.getKey(), entry.getValue()); 
} 

List<myPojoClass> response = c.list(); 
return response; 
} 

你可以做,如果類似的事情你想改變獲取模式。當然,調用方法需要知道數據模型,以便它可以正確設置別名,否則可能會在運行時發生錯誤。

0

從我知道現在有辦法創建沒有標準實例的連接。我建議你創建一些包裝器,其中將包括標準,並在必要的別名定義,然後用標準的訪問者(像這種模式)標準

interface CriterionWrapper { 
    void visit(Criteria c); 
} 
class OnlyCriterionWrapper implements CriterionWrapper { 
    private Criterion c; 
    public void visit(Criteria c){c.add(c);} 
} 
class CriterionWrapper implements CriterionWrapper{ 
    private Criterion c; 
    private String whateverIsNeededToCreateAlias 
    public void visit(Criteria c){ 
     c.createAlias(whateverIsNeededToCreateAlias); 
     c.add(c); 
    } 
} 

,然後通過列表作爲參數傳遞給您的getDataByCriterion()方法