Несколько столбцов в QueryDSL

Я пытаюсь получить список нескольких столбцов из моей таблицы с помощью QueryDSL и автоматически заполнить свой объект БД, как этот пример в более старом руководстве:

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

Проблема в том, что похоже, что класс EConstructor был удален в версии 2.2.0, и все примеры, которые я нахожу сейчас, выглядят так:

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

Что заставляет меня вручную приводить все объекты к моему классу CatDTO.

Есть ли альтернатива этому? Любая альтернатива EConstructor?


person Gonçalo Cardoso    schedule 14.09.2012    source источник


Ответы (3)


EConstructor был заменен на ConstructorExpression в Querydsl 2.0. Таким образом, ваш пример станет

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 для проекций нескольких столбцов вместо массивов объектов.

person Timo Westkämper    schedule 14.09.2012
comment
Итак, в любом случае (List‹Object[]› или List‹Tuple›) мне нужно вручную присвоить каждое возвращаемое значение объекта моему классу CatDTO? - person Gonçalo Cardoso; 17.09.2012
comment
EConstructor является ConstructorExpression начиная с версии 2.0, в качестве альтернативы вы можете аннотировать конструктор CatDTO с помощью @QueryProjection и использовать новый QCatDTO(... - person Timo Westkämper; 18.09.2012
comment
@balizeiro, вам нужна другая информация? - person Timo Westkämper; 18.09.2012
comment
Нет, все в порядке. Большое спасибо - person Gonçalo Cardoso; 18.09.2012

используя поток 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());
person Rafael Zeffa    schedule 10.02.2017

Другой альтернативой является использование класса 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

person Daniel Higueras    schedule 11.07.2017