【问题标题】:JPA criteria: count from multiselect queryJPA 标准:从多选查询中计数
【发布时间】:2023-03-31 18:49:01
【问题描述】:

我想实现一个带有分页的表格组件。表中的结果由这样的多选查询检索:

SELECT DISTINCT t0.userId,
            t0.userName,
            t1.rolleName
FROM userTable t0
LEFT OUTER JOIN roleTable t1 ON t0.userId = t1.fkUser
WHERE(t0.userType = 'normalUser' AND t1.roleType = 'loginRole')

我可以通过多选查询获得此结果。

现在对于分页,我必须首先检索总行数。 有没有人可以为这个 sql 之一定义条件查询?我失败了,因为子查询不支持多选,而且我不知道如何将这个不同的内容放入 count 语句中。

SELECT COUNT(*) FROM
(
   SELECT DISTINCT t0.userId,
                   t0.userName,
                   t1.rolleName
   FROM userTable t0
   LEFT OUTER JOIN roleTable t1 ON t0.userId = t1.fkUser
   WHERE(t0.userType = 'normalUser' AND t1.roleType = 'loginRole')
)

SELECT COUNT(DISTINCT t0.userId || t0.userName || t1.rolleName)
FROM userTable t0
LEFT OUTER JOIN roleTable t1 ON t0.userId = t1.fkUser
WHERE(t0.userType = 'normalUser' AND t1.roleType = 'loginRole')

提前致谢!

顺便说一句。我在 WebSphere AppServer 上使用 OpenJpa

【问题讨论】:

  • 这不是 Criteria API 问题。我正在删除该标签。它看起来像原生 SQL,不是吗?
  • @carbontax 感谢您阅读我的问题,但如果您仔细阅读,您会发现我要求对这些原生 sql 之一进行条件查询。所以criteriaApi标签是正确的。
  • JPQL SELECT COUNT(DISTINCT CONCAT(t0.userId, t0.userName, t1.rolleName) FROM User t0 LEFT OUTER JOIN t0.roles t1 WHERE(t0.userType = 'normalUser' AND t1.roleType = 'loginRole') 怎么样?
  • @ChristianBeikov 感谢您的评论。不幸的是,我只能使用标准 api,因为在我的生产性查询中有许多变量选择参数,我必须首先检查空值或默认值。
  • 你的问题解决了吗?

标签: jpa java-ee-6 criteria-api


【解决方案1】:

以下内容未经测试,但应该可以工作:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> query = builder.createQuery(Long.class);
Root<User> t0 = query.from(User.class);
Join<User, Role> t1 = t0.join("roles", JoinType.LEFT); 
query.select(builder.concat(t0.get(User_.userId), builder.concat(t0.get(User_.userName), t1.get(Role_.rolleName))).distinct(true);
query.where(cb.equal(t0.get("userType"), "normalUser"), cb.equal(t1.get("roleType"), "loginRole"));
TypedQuery<Long> tq = em.createQuery(query); 

【讨论】:

【解决方案2】:

由于已知问题https://jira.spring.io/browse/DATAJPA-1532 Multiselect 不适用于 repo.findall 方法。我通过将实体管理器自动装配到服务类来处理这个问题。

@Autowired
    EntityManager entityManager;
    public List<?> getResults() throws ParseException 
    {
        //ModelSpecification modelSpecification = new ModelSpecification();
        CriteriaQuery<DAO> query = modelSpecification.getSpecQuery();
        TypedQuery<DAO> typedQuery = entityManager.createQuery(query);
          List<?> resultList = typedQuery.getResultList();
        
        //List<DAO> allData  = entityManager.createQuery(query).getResultList();
        return resultList;
    }

你可以在这里找到工作代码https://github.com/bsridharpatnaik/CriteriaMultiselectGroupBy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多