【发布时间】:2020-12-15 16:19:30
【问题描述】:
我对 Jpa 规范有疑问。
我的规范如下所示:
public static Specification<PersonView> getByFilter(PersonViewFilter filter) {
return (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
SetJoin<PersonView, PersonDetailsView> personDetailsJoin =
root.join(PersonView_.personDetails);
Path<String> namePath = personDetailsJoin.get(PersonDetailsView_.name);
Path<String> surnamePath = personDetailsJoin.get(PersonDetailsView_.surname);
predicates.add(namePredicate(personDetailsJoin, criteriaBuilder, filter.getName()));
predicates.add(surnamePredicate(personDetailsJoin, criteriaBuilder, filter.getSurname()));
predicates.add(peselPredicate(personDetailsJoin, criteriaBuilder, filter.getPesel()));
predicates.removeAll(Collections.singleton(EMPTY_PREDICATE));
query.orderBy(List.of(criteriaBuilder.asc(namePath), criteriaBuilder.asc(surnamePath))).distinct(true);
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
};
}
当我尝试搜索结果时,我会看到一个错误: ORA-01791:不是 SELECTed 表达式
问题与 JpaSpecificationExecutor 生成的 sql 有关。 它看起来像这样:
select
*
from
( select distinct pv.person_id
from
personview pv
inner join
persondetailsview pdv on pv.person_id=pdv.person_id
where
1=1
order by
pdv.name asc,
pdv.surname asc )
where
rownum <= ?
在 Select clausule 中应该添加姓名和姓氏然后它会起作用,但我不知道如何在规范中执行此操作。没有不同的查询工作,但我没有重复。 请寻求帮助。
【问题讨论】:
标签: sql spring oracle jpa repository