假设我有一个名为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);
答案 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构建器。您键入的代码更少,并且可以根据需要减少带宽。