休眠:标准。向标准对象添加别名

问题描述:

在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增加其他逻辑和这一类如上。

你又来了! ;)

你可以通过条目(如一个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; 
} 

你可以做,如果类似的事情你想改变获取模式。当然,调用方法需要知道数据模型,以便它可以正确设置别名,否则可能会在运行时发生错误。

从我知道现在有办法创建没有标准实例的连接。我建议你创建一些包装器,其中将包括标准,并在必要的别名定义,然后用标准的访问者(像这种模式)标准

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()方法