如何使用hibernateTemplate为多个HQL获取EntityObject

时间:2012-06-18 06:54:47

标签: java spring hibernate

我有一张桌子说

MyTable (myId,myStringCol1,myStringCol2,myStringCol3)

使用时

QUERY1

hibernateTemplate.find("SELECT new(myId,myStringCol1) from MyTable")

我正在获取MyTable对象,为此,MyTable类中应该有一个像这样的构造函数

MyTable{
      MyTable(Integer id,String col1){
          this.id = id;
          this.col1 = col1;
       }

}

但是在另一种方法中,我这样称呼

QUERY2

hibernateTemplate.find("SELECT new(myId,myStringCol2) from MyTable")  ///myStringCol2

这里,还有一个构造函数,如上所述,但是我们不能创建相同的签名构造函数。 因此,当运行第二个查询(QUERY2)时,我在col1中获取myStringCol2值 因为第一个构造函数。

那我怎么解决这个问题..

等待建议。

3 个答案:

答案 0 :(得分:2)

首先,我可能只是在两种情况下都选择完整的实体,因为它在性能方面没有太大的区别,你会有一个附加的实体,而且会更简单。

现在回答您的技术问题,只需在结果上实现循环:

String hql = "select mt.myId, mt.myStringCol2 from MyTable mt";
List<Object[]> rows = session.createQuery(hql).list();
List<MyTableDTO> result = new ArrayList<MyTableDTO>(rows.size());
for (Object[] row : rows) {
    result.add(new MyTableDTO((Long) row[0], (String) row[1]));
}

就这么简单,你可以将可重构的代码作为附加奖励。

我还强烈建议不要使用实体类来存储此类查询的结果。创建仅包含查询返回的字段的特定DTO对象。如果方法返回实体类的实例,则调用者将期望获得正确的,完全填充的附加实体实例。

答案 1 :(得分:1)

这个怎么样:

class MyTable1{
      MyTable1(Integer id,String col1, String col2){
          this.id = id;
          this.col1 = col1;
          this.col2 = col2;
       }

}

然后:

Q1

hibernateTemplate.find("SELECT new(myId,myStringCol1,'') from MyTable")

Q2

hibernateTemplate.find("SELECT new(myId,'',myStringCol2) from MyTable") 

很好如果你可以传递null而不是'',但AFAIK你不能,因为有一个错误阻止你这样做:{{ 3}}。因此,您 使用''

受Talha回答启发的另一个选择是:

class MyTable{
      MyTable(Integer id,String col1, Boolean isColumn2){
          this.id = id;
          if(isColumn2){
             this.col2 = col2;
          }
          else{
             this.col1 = col1;
          }
      }      
}

然后你可以写:

Q1

hibernateTemplate.find("SELECT new(myId,myStringCol1,false) from MyTable")

Q2

hibernateTemplate.find("SELECT new(myId,myStringCol2,true) from MyTable") 

答案 2 :(得分:0)

您需要的是一个单独的DTO。

MyTableDto {
      MyTableDto1(Integer id,String col) {
          this.id = id;
          this.col = col;
       }

}

然后,您可以单独查询列:

hibernateTemplate.find("SELECT new MyTableDto(t.id,t.myStringCol1) from MyTable t");

hibernateTemplate.find("SELECT new MyTableDto(t.id,t.myStringCol2) from MyTable t");

为了进一步消除代码中的歧义并使其更具可读性,您可以创建两个单独的DTO对象(它们只会在名称上有所不同,但会因为它们保存不同的数据而使代码更具可读性)。