gpt4 book ai didi

java - 对多列进行不同计数 JPA2 规范

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:56 25 4
gpt4 key购买 nike

我正在尝试从 Oracle 数据库中查找一些结果,由于数据模型的原因,我有重复的数据,但我不想显示这些数据。

为了做到这一点,我认为在 CriteriaQuery 中使用 DISTINCT 应​​该可以解决问题。但在这里我遇到了问题:

必须在 2 列上进行区分,这会使代码抛出以下异常:“ORA-00909:参数数量无效”。

经过一些谷歌搜索,发现使用这个东西:||分离列是可行的,但我也没有任何线索来做到这一点。

所以:

区分我的数据的正确方法是这样的:

SELECT DISTINCT column1, column2 FROM ...

但是 Hibernate 是这样构建的:

SELECT DISTINCT COUNT( DISTINCT column1, column2) FROM

后一个查询是抛出异常的查询。有没有办法告诉 Hibernate 执行两个查询中的第一个?

提前致谢。

编辑

涉及的代码是这样的:

return new Specification<ProfilingInstructionAccessEntity>() {

@Override
public Predicate toPredicate(Root<ProfilingInstructionAccessEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
final List<Predicate> predicates = new ArrayList<>();
List<FilterDTO> activeFilters = filtersService.findAllActive();

filters.forEach((k, v) -> {
if (!StringUtils.isBlank(v)) {
SpecificationHelperEnum helperEnum = SpecificationHelperEnum.getByKey(k);
SpecFilter filter = (SpecFilter) appContext.getBean(helperEnum.getFilter());
// query.select(root.get("concated")).distinct(true); <-- This line is what I tried. Also tried this: query.distinct(true);
Predicate predicate = filter.createSmartPredicate(root, cb, v, helperEnum.getFilterId(), activeFilters);

predicates.add(predicate);
}
});
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
};

@Override
public Predicate createSmartPredicate(Root<ProfilingInstructionAccessEntity> root, CriteriaBuilder cb, String value, Integer filterId, List<FilterDTO> activeFilters) {
List<AssetDTO> assets = service.findBySpec("origin", value);
List<Predicate> assetPredicates = new ArrayList<>();
Join<Object, Object> aux = root.join(SearchPathEnum.ACCESS.getPath()).join(SearchPathEnum.ACCESS_FILTERS.getPath());
for (AssetDTO assetDTO : assets) {
List<Predicate> filterPredicates = new ArrayList<>();
for (FilterDTO filterDTO : activeFilters) {
filterPredicates.add(buildPredicate(assetDTO, filterDTO.getMappedValue(), aux, cb));
}
assetPredicates.add(cb.or(filterPredicates.toArray(new Predicate[filterPredicates.size()])));
}
return cb.or(assetPredicates.toArray(new Predicate[assetPredicates.size()]));
}

private Predicate buildPredicate(AssetDTO assetDTO, String mappedValue, Join<Object, Object> aux, CriteriaBuilder cb) {
Predicate filterCode = cb.equal(aux.get(SearchPathEnum.FILTER.getPath()).get(SearchPathEnum.MAPPED_VALUE.getPath()), mappedValue);
String value = (String) ReflectionComponent.invokeByReflection(assetDTO, "get" + StringUtils.capitalize(mappedValue), null);
Predicate filterValue = cb.like(aux.get(SearchPathEnum.FILTER_VALUE.getPath()), "%" + value.trim() + "%");
return cb.and(filterCode, filterValue);
}

这有点复杂,但最终它有点像“智能”搜索。我有大约 20 个过滤器,其中任何一个都会触发其他过滤器的搜索。

如果需要更多信息,请随时询问。谢谢!

最佳答案

count(distinct column1, column2) 无效。

实际上,这就是

select count(*)
from (select distinct column1, column2 from some_table);

我不知道hibernate,但是 - 也许上面发布的代码会引起您的注意:)

关于java - 对多列进行不同计数 JPA2 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48187669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com