休眠条件查询仅获取特定列

卡罗琳

我有两个表:ReportRows和DataRows

表格ReportRows:

@Id
@Column(name = "ID")
private Long id;

@ManyToOne
@JoinColumn(name = "T_REPORT_CODE")
  private Report report;

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "T_DATA_ROWS_ID")
  private DataRow dataRow;

额外的获取器和设置器;

表格DataRows:

@Id
@Column(name = "ID")
    private Long id;

@Column(name = "VALUE_0")
    private String value0;

@Column(name = "VALUE_1")
    private String value1;

@Column(name = "VALUE_2")
    private String value2;

...

@Column(name = "VALUE_30")
    private String value30;

额外的获取器和设置器

列出数据时,从ReportRows中选择,然后DataRows从两个表中获取所有列。我只需要DataRows的几列(我指定了它)。

选择要获取的内容,如下所示:

SELECT 
dataRows.value0,
dataRows.value1
from
t_report_rows this_
inner join
t_reports report_ on report_.id = this_.report_id
inner join
t_data_rows dataRows_ on dataRows_.id = this_t_data_rows_id
where report_.id = 1

这只是我写的例子。关键是每个查询我需要不同的列。一次将是value0,value1,第二次将是value0,value2。

当我查询时,我知道我需要哪些列。我创建这样的条件(Columns是我从中检索列名称的类):

public List<ReportRow> list(Criteria criteria, Long reportId) {
    criteria.add(Restrictions.eq("report.id", reportId));
    ProjectionList projectionList = Projections.projectionList();
    for (Column col : columnList) {
        String columnName = getColumnId(col);
        projectionList.add(Projections.property(columnName));
        //I also tried like this:
        // projectionList.add(Projections.property(columnName), columnName);
        //or like this:
        //projectionList.add(Projections.property(columnName), getColumnId2(col));
        //also added this line with each of above:
        //criteria.setResultTransformer(Transformers.aliasToBean(ReportRow.class));
    }
    criteria.setProjection(projectionList);

    return list(criteria);
}

方法getColumnId和getColumnId2:

protected String getColumnId(Column col) {
    StringBuilder b = new StringBuilder();
    b.append("dataRow.value");
    b.append(col.getRowIndex());
    return b.toString();
  }

  protected String getColumnId2(Column col) {
    StringBuilder b = new StringBuilder();
    b.append("value");
    b.append(col.getRowIndex());
    return b.toString();
  }

我收到错误消息:org.hibernate.QueryException:无法解析属性:dataRow.value0

有可能做我想做的事吗?从基于Projection和table Column的表dataRows中仅获取特定列存储列索引的列?

更新1:
我添加了自定义转换器。一切正常。这样做是为了提高sql的速度。现在,它正在使用少量列进行查询。真的很棒。我在休眠状态下打开了show sql。自定义转换器之后,它正在使用以下命令对数据库的每一行进行新查询:

where reportRowId = ?

你知道为什么吗?

现在,自定义Transformer transformTuple方法看起来像这样:

@Override
  public Object transformTuple(Object[] tuple, String[] aliases) {
    ReportRow row = new ReportRow();
    DataRow dataRow = new DataRow();
    row.setGridRow(dataRow);

    for (int i = 0 ; i < aliases.length; i++) {
      if ("id".equals(aliases[i])) {
        row.setId((Long) tuple[i]);
      } else if ("entityVersion".equals(aliases[i])) {
        row.setEntityVersion((Long) tuple[i]);
      } else if ("dataRowId".equals(aliases[i])) {
        dataRow.setId((Long) tuple[i]);
      } else if ("rowEntityVersion".equals(aliases[i])) {
        dataRow.setEntityVersion((Long) tuple[i]);
      } else if ("value0".equals(aliases[i])) {
        dataRow.setValue0((String) tuple[i]);
      } else if ("value1".equals(aliases[i])) {
        dataRow.setValue1((String) tuple[i]);
      }
    }

    return row;
  }
拉德涅夫

我有问题,因为当我setResultTransformer时,它返回带有空变量的对象。例。getId()为null(我添加了projectionList.add(Projections.property(“ id”));)

您需要指定投影的别名

projectionList.add(Projections.property("id").as("id"));

是的,它有效。谢谢。我还有一个问题。如果我还想在此查询实体报表和列中返回value0,value1,我该怎么办?

您可以Report通过为它的列指定投影来获得一部分您需要获取ReportRows投影ReportDataRow嵌套投影的属性使用它们。

对于嵌套投影,可以使用自定义转换器

如何使用Hibernate转换平面结果集

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章