2

すべての列を列挙せずに、select 句のエンティティの列を (sql ではなく) hql でオーバーライドしたいと思います。エンティティは複雑なので、ここには記載しません。代わりに、簡単な例で質問を単純化します。

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 句での新しい 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 に答える