Создать критерии из подзапроса - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь преобразовать свой запрос в критерии, где у меня возникают проблемы. Ниже приведен запрос, который я пытаюсь преобразовать

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 не приходит в запросе. Как я могу добавить его в запрос?

1 Ответ

0 голосов
/ 27 мая 2019

Я получил ответ. Я могу просто удалить

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...