使用Querydsl仅在Spring中选择特定列?

时间:2017-04-27 10:21:18

标签: spring spring-data-jpa querydsl

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

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

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

我担心querydsl与spring的集成只允许构建动态谓词,而不是按照spring data documentation指示的完整查询。

我想虽然您可以在不修改代码的情况下使用Employee类中的getId()方法。

答案 2 :(得分:0)

您无法在存储库中创建执行此工作的特定方法吗?

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

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

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

答案 3 :(得分:0)

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

我可以尝试另一种方法:在后端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;

然后添加一个新的entity / dto / dao,但是您可以在Spring项目中查看它,还可以在类中除了@Entity之外还添加@Immutable。

这种方法不会使您对现有代码进行任何大刀阔斧的操作,而且更有意义,因为您仍然可以使用QuerydslPredicateExecutor或QueryDSL构建器。您键入的代码更少,并且可以根据需要减少带宽。