我有非常类似于以前问的问题。除了在我的情况下查询是要找到多个和()
public interface IQuotaRepository extends JpaRepository<QuotaDao, Long>, JpaSpecificationExecutor<QuotaDao> {
@Query( "select new ca.quota.kpi.model.dto.TotalDto(sum(q.value1), sum(q.value2), sum(q.value3), sum(q.value4), "
+ "sum(q.value5), sum(q.value6), sum(q.value7), sum(q.value8), "
+ "sum(q.value9), sum(q.value10), sum(q.value11), sum(q.value12)) from QuotaDao q")
public TotalDto sumQuota();//Specification<QuotaDao> spec
@Query( "select new ca.quota.kpi.model.dto.TotalDto(sum(q.value1), sum(q.value2), sum(q.value3), sum(q.value4), "
+ "sum(q.value5), sum(q.value6), sum(q.value7), sum(q.value8), "
+ "sum(q.value9), sum(q.value10), sum(q.value11), sum(q.value12)) from QuotaDao q")
public TotalDto sumQuotaWithSpec(Specification<QuotaDao> spec);
}
我希望重用“规范规范”来过滤来自网格控制的各种参数的结果。
你能建议任何解决方案或替代方案吗
好我发现解决方案可能比严格的JPA方法更有效
首先,我在存储库接口中声明了方法
public interface IQuotaRepositoryCustom{
public TotalDto sumQuotaWithFilters(FilterParameterExtJs6[] filters);
...
}
然后在存储库实现中实现此方法
@Repository
public class IQuotaRepositoryImpl implements IQuotaRepositoryCustom {
private static Logger logger = Logger.getLogger(IQuotaRepositoryImpl.class);
private final String SELECT_COUNT_FOR_TOTAL = "select count(*)";
private final String SELECT_COUNT_FOR_TOTAL_QUOTA = SELECT_COUNT_FOR_TOTAL + " from QuotaDao q";
private final String SELECT_TOTAL = "select new org.avp.quota.kpi.model.dto.TotalDto(sum(q.value1), sum(q.value2), sum(q.value3), sum(q.value4), "
+ "sum(q.value5), sum(q.value6), sum(q.value7), sum(q.value8), "
+ "sum(q.value9), sum(q.value10), sum(q.value11), sum(q.value12))";
private final String SELECT_TOTAL_QUOTA = SELECT_TOTAL + " from QuotaDao q";
...
public TotalDto sumQuotaWithFilters(FilterParameterExtJs6[] filters) {
String countHql = SELECT_COUNT_FOR_TOTAL_QUOTA + buildWhereClause(filters);
Query countQuery = em.createQuery(countHql.toString());
Long count = (Long)countQuery.getSingleResult();
if(count.longValue() == 0L)
return new TotalDto();
String hql = SELECT_TOTAL_QUOTA+ buildWhereClause(filters);
Query query = em.createQuery(hql.toString());
return (TotalDto) query.getSingleResult();
}
}
TotalDto是普通的数据传输对象
public class TotalDto {
private long value1;
private long value2;
private long value3;
private long value4;
private long value5;
private long value6;
private long value7;
private long value8;
private long value9;
private long value10;
private long value11;
private long value12;
private long total;
// constructor and getters/setters removed
}
顾名思义,localhelper函数只是构建where子句字符串(我不发布代码,因为来自UI的非常特定的格式)
private String buildWhereClause(FilterParameterExtJs6[] filterParameters) {
StringBuffer sb = new StringBuffer();
// Build where clause string
return sb.toString();
}
最后,在服务中调用此存储库方法
public TotalDto getFilteredSummAggregateQuota(final FilterParameterExtJs6[] filterParameters){
TotalDto aggregateTotalQuota = quotaRepository.sumQuotaWithFilters(filterParameters);
return aggregateTotalQuota;
}
希望这能帮助你四处走动。
问题内容: 是否可以在一种存储库方法中同时使用注释和规范?例如,我想要一个这样的方法: 是否可以或应该将整个查询构建为a 并删除注释? 问题答案: 首先,您可能想阅读此博客文章。其次,根据存储库应实现的接口,可以使用“规范”运行以下查询: 因此,您不能混合使用(或查询方法)和s。 您可以表达这种情况: 使用一个代替。然后,您可以根据需要组合任意多个规格。
问题内容: 是否可以在一种存储库方法中同时使用注释和规范?例如,我想要一个这样的方法: 是否可以或应该将整个查询构建为a 并删除注释? 问题答案: 首先,你可能想先阅读此博客文章。其次,根据存储库应实现的接口,可以使用“规范”运行以下查询: 因此,你无需将s @Query(或查询方法)混合使用Specification。 你可以表达这种情况: 使用一个代替。然后,你可以根据需要组合任意多个规格。
是否可能或者应该将整个查询构建为并删除注释?
如何使用规范编写下面查询 当我们使用Specification时,即使在multiselect中提到了count(),也没有选择count()。 为什么JPA中的multiselect方法不起作用
问题内容: 我可以在mysql中使用聚合函数(LAST)吗? 如果是,那么为什么给我以下查询错误: 错误 ::您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’()FROM group by ‘ 附近使用正确的语法 编辑 ::我得到答案“最后一个”不在MySql中使用。那么如何在MySql中执行呢? 问题答案: 不,在mysql中没有所谓的LAST 查看汇总函数列表
我有很多相同类的实例。现在这些对象可以被链接并且这个链接可以有一个权重。就像在无向图中一样。现在我想在我的mysql数据库中存储每两个对象之间的关系。 数据如下所示 我可以创建一个具有以下结构的表: 但是在搜索两个对象之间的权重时,我不知道哪个是和哪个是。所以我需要写两个查询。此外,如果我想添加权重,并且想首先检查它是否已经在我的数据库中,我必须编写两个查询以确保它不在其中。 这两个问题是: 以确