2

在 Hibernate 中,有没有一种方法可以创建向 Criterion 对象添加别名。我有以下工作:

我从包含许多表的大型数据库中进行动态搜索。搜索在客户端选择了许多 (25+) 可选的非独占参数。这需要使用 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");

然后,我需要像上面那样向这个类添加其他逻辑和。

4

2 回答 2

4

又是你!;)

您可以传递一组条目(如 HashMap<String, String>)并遍历它们以填充您的别名......像这样:

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

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

于 2012-07-17T19:30:47.520 回答
0

据我所知,现在有一种方法可以在没有 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() 方法

于 2012-07-17T19:23:56.613 回答