【问题标题】:Multiple columns in QueryDSLQueryDSL 中的多列
【发布时间】:2012-09-14 15:32:48
【问题描述】:

我正在尝试使用 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 替代方案?

【问题讨论】:

    标签: java database querydsl


    【解决方案1】:

    在 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 中用于多列投影而不是对象数组。

    【讨论】:

    • 所以在任何一种情况下(List 或 List)我都需要手动将每个返回对象值分配给我的 CatDTO 类?
    • EConstructor 是 ConstructorExpression 从 2.0 开始,或者您可以使用 @QueryProjection 注释 CatDTO 的构造函数并使用 new QCatDTO(...
    • @balizeiro,您还需要其他信息吗?
    • 不,一切正常。非常感谢
    【解决方案2】:

    使用 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());
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-09
        • 2019-06-24
        • 1970-01-01
        • 2018-01-31
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多