【问题标题】:Hibernate: Criterion. Add Alias to Criterion Object休眠:标准。向标准对象添加别名
【发布时间】:2012-07-17 18:25:37
【问题描述】:

在 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 进行联接,并想知道是否可以将别名添加到上面的条件列表中。
有点像:

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

然后,我需要像上面一样将其他逻辑和添加到此类。

【问题讨论】:

    标签: java hibernate criteria alias


    【解决方案1】:

    又是你! ;)

    您可以传递一组条目(如 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;
    }
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-04-12
        • 2021-10-19
        • 2011-10-09
        • 2012-12-24
        • 2011-08-13
        • 2011-04-11
        • 1970-01-01
        相关资源
        最近更新 更多