6

I'm trying to get a list of multiple columns from my table using QueryDSL, and automatically fill my DB object, like this example in an older manual:

List<CatDTO> catDTOs = query.from(cat)
    .list(EConstructor.create(CatDTO.class, cat.id, cat.name));

The problem is that it looks like the EConstructor class was removed in version 2.2.0, and all the examples I find now are like this:

List<Object[]> rows = query.from(cat)
    .list(cat.id, cat.name);

Which forces me to manually cast all the objects into my CatDTO class.

Is there any alternative to this? Any EConstructor alternative?

4

3 に答える 3

8

Querydsl 2.0では、EConstructorがConstructorExpressionに置き換えられました。だからあなたの例は

List<CatDTO> catDTOs = query.from(cat)
    .list(ConstructorExpression.create(CatDTO.class, cat.id, cat.name));

CatDTOコンストラクターに注釈を付けて、次のようにクエリすることもできます

List<CatDTO> catDTOs = query.from(cat)
    .list(new QCatDTO(cat.id, cat.name));

または、より一般的なアクセスオプションを提供するQTupleプロジェクションを使用することもできます

List<Tuple> rows = query.from(cat)
    .list(new QTuple(cat.id, cat.name));

実際の値には、次のようにパスを介してアクセスできます。

tuple.get(cat.id)

tuple.get(cat.name)

Querydsl 3.0では、オブジェクト配列ではなく、複数列のプロジェクションにタプルプロジェクションが使用される可能性があります。

于 2012-09-14T20:38:11.057 に答える
4

queryDSL 4 および Java 8 ストリームを使用:

List<CatDTO> cats = new JPAQueryFactory(entityManager)
        .select(cat.id, cat.name)
        .from(cat)
        .fetch()
        .stream()
        .map(c -> new CatDTO(c.get(cat.id), c.get(cat.name)))
        .collect(Collectors.toList());
于 2017-02-10T17:16:22.070 に答える
0

もう 1 つの方法は、 class を使用することProjectionsです。のように、パラメータとして渡すフィールドを使用してオブジェクトを構築しますEConstructor。例:

List<CatDTO> catDTOs = query.from(cat)
    .list(Projections.bean(CatDTO.class, cat.id, cat.name));

参照: http://www.querydsl.com/static/querydsl/4.0.5/apidocs/com/querydsl/core/types/Projections.html

于 2017-07-11T06:27:24.173 に答える