休眠:标准。向标准对象添加别名
问题描述:
在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()方法