2

我想用 hql(不是 sql!)覆盖 select 子句中的实体列,而不枚举所有列。我不会把我的实体放在这里,因为它们很复杂。相反,我通过一个简单的例子来简化这个问题。

考虑我有一个 CarEntity:

public CarEntity{
    private Long id;
    private Integer color;
    private Long Date;
    //...

    //getters and setters
}

要获得所有汽车,我执行以下 hql 请求:

String query = "select c from CarEntity c";

现在,我想在 hql 的 select 子句中将 Date 值替换为 0。我怎样才能做到这一点?

我知道我不感兴趣的 3 种可能性,因为我的实体有很多列:

1)java(不是一个好的解决方案):

String hql = "select c from CarEntity c";
List<CarEntity> list = session.createQuery(hql).list();
session.close();
for (CarEntity car: list)
    car.setDate(0);

2) sql:

String sql = "select id, 0 as date from car";
List<CarEntity> list = session.createSQLQuery(sql)
    .addScalar("id",LongType.INSTANCE)
    .addScalar("date",LongType.INSTANCE)
    .setResultTransformer(Transformers.aliasToBean(CarEntity.class))
    .list();

3) hql(在 select 子句中使用 new CarEntity):

String hql = "select new CarEntity(c.id,0) from CarEntity c";

当然,在最新的情况下,我必须在 CarEntity 中添加一个新的合适的构造函数。

非常感谢。

4

1 回答 1

1

如果您有一个与 DAO 层对话并返回 VO/DTO 但最好不返回实体本身的服务层,您可能希望以不同的方式查看问题。在这种情况下,您可以在实体中具有瞬态字段或在服务层中构建逻辑。但这又取决于您的应用程序的现有设计。

于 2012-12-24T02:56:36.450 回答