6

我正在尝试使用 QueryDSL 从我的表中获取多个列的列表,并自动填充我的 DB 对象,就像旧手册中的这个示例:

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 替代方案?

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

另一种选择是使用类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 回答