【问题标题】:Select only specific column in Spring with Querydsl?使用Querydsl仅选择Spring中的特定列?
【发布时间】:2017-09-25 02:02:59
【问题描述】:

假设我有一个名为 Employee 的模型,有 70 列。我如何实现查询 SELECT id from t_employee in spring + querydsl 无需修改此代码中的大量代码。

BooleanExpression paramEmployee = qEmployee.company.id.eq(new Long(data.get("company").toString()));
Iterable<Employee> employeeReportIterable =employeeRepository.findAll(paramEmployee);

【问题讨论】:

    标签: spring spring-data-jpa querydsl


    【解决方案1】:

    恐怕 querydsl 与 spring 的集成只允许构建动态谓词,而不是根据 spring data documentation 指示的完整查询。

    我想你可以直接使用 Employee 类中的 getId() 方法而不修改代码。

    【讨论】:

    • 是的,但这意味着我需要使用完整的模型字段对列表进行迭代!并且只将 id 拆分为 arraylist(double process) 有没有办法只返回 id 而不是整个模型字段 T-T
    • 我不知道,至少使用 querydsl,老实说,考虑到您的查询的复杂性,我不确定它是否是最佳选择。也许您可以考虑使用 @Query 注释创建自定义查询。
    • 我也想知道怎么做,因为即使我像@megalucio 说的那样使用查询注释,我也会失去用谓词过滤的能力。
    【解决方案2】:

    如果您想使用 QueryDSL 谓词并具有单一属性响应,您可以直接使用 QueryDSL 而无需使用 spring-data。

    // where entityManager is a JPA EntityManager
    JPAQuery<?> query = new JPAQueryFactory(entityManager);
    
    BooleanExpression paramEmployee = qEmployee.company.id.eq(new Long(data.get("company").toString()));
    
    List<Long> id = query.select(qEmployee.id).from(qEmployee).where(paramEmployee).fetch();
    

    【讨论】:

    • 在查询中找不到select() 方法(已获得QueryDsl-JPA 3.2.0)
    【解决方案3】:

    你不能在你的存储库中创建特定的方法来完成这项工作吗?

    employeeRepository.findAllByComapanyId(new Long(data.get("company").toString()));
    

    并使用 QueryDSL 实现它(取决于版本):

    return new JPAQuery(entityManager)
    .from(employee)
    .where(employee.companyId.eq(comapanyId))
    .list(employee.id);
    

    【讨论】:

      【解决方案4】:

      很抱歉在较旧的帖子上发帖,但如果您不希望有太多的灵活性,此解决方案可能会有意义。

      我会尝试另一种方法:在后端 SQL(或 NOSQL d.b.)中创建一个新视图。这个视图在 MySql 中看起来像这样:

          CREATE OR REPLACE VIEW `employee_public` AS
              SELECT e.id as employee_id, (CASE WHEN u.publicizeLocation=false THEN null ELSE 
          e.addressLocation as addressLocation) FROM employee_id e;
      

      然后添加一个新的实体/dto/dao,不管你在 Spring 项目中如何看待它,但除了 @Entity 之外,还要将 @Immutable 添加到类中。

      这种方法不会让您对现有代码做任何剧烈的事情,而且它更有意义,因为您仍然可以使用 QuerydslPredicateExecutor 或 QueryDSL 构建器。您输入的代码更少,并且可以根据需要减少带宽。

      【讨论】:

        猜你喜欢
        • 2019-04-05
        • 1970-01-01
        • 2022-11-09
        • 2014-03-27
        • 2015-11-29
        • 1970-01-01
        • 2021-08-17
        • 2012-09-19
        相关资源
        最近更新 更多