我有一张桌子说
MyTable (myId,myStringCol1,myStringCol2,myStringCol3)
使用时
hibernateTemplate.find("SELECT new(myId,myStringCol1) from MyTable")
我正在获取MyTable对象,为此,MyTable类中应该有一个像这样的构造函数
MyTable{
MyTable(Integer id,String col1){
this.id = id;
this.col1 = col1;
}
}
但是在另一种方法中,我这样称呼
hibernateTemplate.find("SELECT new(myId,myStringCol2) from MyTable") ///myStringCol2
这里,还有一个构造函数,如上所述,但是我们不能创建相同的签名构造函数。 因此,当运行第二个查询(QUERY2)时,我在col1中获取myStringCol2值 因为第一个构造函数。
那我怎么解决这个问题..
等待建议。
答案 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对象(它们只会在名称上有所不同,但会因为它们保存不同的数据而使代码更具可读性)。