0

我有一张桌子说

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 值。

那么我该如何解决这个问题..

等待建议。

4

3 回答 3

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 对象。如果一个方法返回一个实体类的实例,调用者将期望得到正确的、完全填充的、附加的实体实例。

于 2012-06-18T07:20:25.273 回答
1

这个怎么样:

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

}

进而:

第一季度

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

第二季度

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

如果你可以传递 null 而不是 ''会很好,但 AFAIK 你不能,因为有一个错误阻止你这样做:https ://forum.hibernate.org/viewtopic.php?f=1&t=985612&start =0。所以,你将不得不使用''

受 Talha 答案启发的另一种选择是:

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

然后你可以写:

第一季度

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

第二季度

hibernateTemplate.find("SELECT new(myId,myStringCol2,true) from MyTable") 
于 2012-06-18T07:14:29.897 回答
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 对象(它们只会在名称上有所不同,但会使您的代码更具可读性,因为它们包含不同的数据)。

于 2012-06-18T07:26:41.750 回答