【问题标题】:Create criteria from sub query从子查询创建条件
【发布时间】:2019-10-12 15:39:05
【问题描述】:

我正在尝试将我的查询转换为我遇到问题的标准。以下是我要转换的查询

SELECT 
    machine_type_id,
    machine_type,
    user_name
FROM
    nc_machine_types
WHERE
    CASE
        WHEN
            TRIM(':q') = ''
                OR ':q' IS NULL
        THEN
            machine_type IS NOT NULL
        ELSE (machine_type = ':q'
            OR machine_type_id = (SELECT 
                machine_type_id
            FROM
                nc_machine_screen
            WHERE
                machine_no = ':q'))
    END

我现在可以转换的谓词是

return new Specification<MachineType>() {
        @Override
        public Predicate toPredicate(Root<MachineType> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            List<Predicate> predicates = new ArrayList<>();             

            if(!StringUtils.isBlank(q)) {

                Subquery<Long> ordersSubquery = query.subquery(Long.class);
                    Root rootB = ordersSubquery.from(Mahine.class);

         ordersSubquery.select(rootB.get("machineType").get("machineTypeId"));
                        ordersSubquery.where(cb.equal(rootB.get("machineNo"), q));


                        predicates.add(cb.equal(root.get("machineType"), q));
                cb.or(cb.equal(root.get("machineId"), ordersSubquery));
            }
            return cb.and(predicates.toArray(new Predicate[0]));
        }
};

正在构造的查询是这样的

select machine_type_id, user_name, machine_type from machine_types where machine_type=?

OR 子句未出现在查询中。如何在查询中添加它?

【问题讨论】:

    标签: hibernate spring-boot jpa criteria


    【解决方案1】:

    我得到了答案。我可以简单地删除

    predicates.add(cb.equal(root.get("machineType"), q));
    cb.or(cb.equal(root.get("machineId"), ordersSubquery));
    

    并添加

    cb.or(cb.equal(root.get("machineType"), q), cb.equal(root.get("machineId"), ordersSubquery));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2018-02-24
      • 2015-12-28
      • 2012-09-30
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多