休眠:标准。将别名添加到Criterion对象

时间:2012-07-17 18:25:38

标签: java hibernate criteria alias

在Hibernate中,有没有办法为Criterion对象创建一个Alias。我有以下工作:

我从大型数据库中搜索了许多表。搜索有许多(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一起加入,并想知道是否可以在上面的Criteria列表中添加别名。
像这样的东西:

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

然后,我需要在上面添加其他Logical和这个类。

2 个答案:

答案 0 :(得分:4)

你又来了! ;)

你可以传递一个条目集合(比如HashMap&lt; String,String&gt;)并迭代它们来填充你的别名......像这样:

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

如果要更改提取模式,可以执行类似操作。当然,调用方法需要知道数据模型,以便正确设置别名,否则可能会在运行时出错。

答案 1 :(得分:0)

据我所知,现在有了创建没有Criteria实例的连接的方法。我建议您为标准创建一些包装器,如果需要,将包含条件和别名定义,然后使用Criteria作为访问者(如此模式)

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

然后将List作为参数传递给getDataByCriterion()方法