在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和这个类。
答案 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()方法