Java 使用hql覆盖select子句中实体的列,而不枚举所有列

Java 使用hql覆盖select子句中实体的列,而不枚举所有列,java,spring,hibernate,hql,Java,Spring,Hibernate,Hql,我想用hql(不是sql!)覆盖select子句中实体的一列,而不枚举所有列。 我不会把我的实体放在这里,因为它们很复杂。相反,我用一个简单的例子来简化这个问题 考虑到我的谨慎: public CarEntity{ private Long id; private Integer color; private Long Date; //... //getters and setters } 要获取所有车辆,我执行以下hql请求: String quer

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

考虑到我的谨慎:

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

    //getters and setters
}
要获取所有车辆,我执行以下hql请求:

String query = "select c from CarEntity c";
现在,我想在hql的select子句中将日期值替换为0我该怎么做?

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

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

当然,在最新的例子中,我必须在CarEntity中添加一个新的合适的构造函数


非常感谢。

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

实体应该表示数据库中实际存在的内容。如果希望一个对象表示其他对象,请使用另一个对象。例如,第一个解决方案将在查询检索到的每一行的date列中保留0。好的,谢谢回答。第一个例子中的持续性很好。但正如我在这里所说,我简化了这个问题。在第一个例子中,我通过关闭会话来分离对象:-)。我会立即在主帖子中编辑并更正此内容。因此,你建议使用另一个对象,因为它是一个公开的事实,它可以方便地公开事实:-)我可以参加,我的朋友和我的朋友…:-)谢谢。实际的用例是什么?正如上面JB所指出的,实体应该为DB数据建模。如果出于某种原因需要重写数据库中的值,请解决该用例并将业务逻辑放在它所属的位置—在服务/业务层,而不是数据访问层。
String hql = "select c from CarEntity c";
List<CarEntity> list = session.createQuery(hql).list();
session.close();
for (CarEntity car: list)
    car.setDate(0);
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();
String hql = "select new CarEntity(c.id,0) from CarEntity c";