Генерация динамического запроса при весенней загрузке - PullRequest
0 голосов
/ 01 мая 2018

У меня есть собственный Mysql запрос

select tl_id,c_name,m_name,u_first_name,t_name, 
tl_logged_at,tl_minutes,tl_description
from users inner join clients on u_id=c_frn_owner_id
inner join matters on m_frn_client_id = c_id
inner join tasks on t_frn_matter_id = m_id
inner join task_logs on tl_frn_task_id = t_id
where c_id =2 and m_id=4 and t_id= 3 and u_id = 4

, для которого я могу написать JPQL вместо собственного запроса. Но как получить тот же запрос, используя JPA Specification, поскольку столбцы или поля в условиях where c_id, m_id, t_id и u_id являются необязательными. Это опции фильтра, предоставляемые пользователю.

Генерация собственного запроса может быть выполнена с использованием условий if. Но они подвержены опечаткам и SQL Injections.

Документация JPASpecification не содержит информации, касающейся объединения нескольких таблиц.

Spring Официальная спецификация JPA Doc

Я очень новичок в JPASpecification, поэтому любое руководство будет полезным.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Посмотрите на проект querydsl, я широко его использую в ERP среднего размера и до сих пор не разочаровался.

http://www.querydsl.com/static/querydsl/latest/reference/html/

для динамического предложения where: вы можете использовать com.querydsl.core.BooleanBuilder

Поэтому, когда у вас есть querydsl, вы можете сначала сгенерировать предложение where, как показано ниже.

QEmployee employee = QEmployee.employee;
 BooleanBuilder dynamicWhere = new BooleanBuilder();
 if(true) { //Any condition
     dynamicWhere.and(employee.name.equalsIgnoreCase("someName"));
 }
 if(true){
     dynamicWhere.and(employee.age.gt(18));
 }

и тогда вы можете написать свой запрос следующим образом.

queryFactory.selectFrom(employee)
    //joins, group by, order by goes here
    .where(dynamicWhere)
    .fetch();
0 голосов
/ 01 мая 2018

В JPA 2 представлен API критериев, который вы можете использовать для построения запросов. программным способом.

Если вы используете JPA 2 и хотите создать динамический запрос, я думаю, вам следует обратиться к Criteria API для построения динамических запросов. Или вы можете использовать JpaSpecificationExecutor (я еще не пробовал.) Проверьте этот связанный вопрос.

Прилагается несколько полезных ссылок:

  1. Технические характеристики JPA
  2. JPA Criteria Api
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...