Я пытаюсь упорядочить данные по полю
Запрос:
select * from user
where (location = "%loc%" and role = "TECH")
order by field (department, "ELEC", "MECH");
Я создал собственный класс Order для заказа по полю, и он работает нормально только в одном условии, где условие, если я предоставляю два, где условие Order не работает и возвращает 0 записей.
Если я удаляю заказ по нему, возвращается ожидаемый результат.
USER TABLE
______________________________________________________
|NAME | AGE | ROLE | DEPARTMENT | LOCATION |
|________|______|____________|____________|___________|
|name1 | 24 | TECH | MECH | location1 |
|name2 | 25 | TECH | ELEC | location2 |
|name3 | 26 | TECH | COMP | location3 |
|name4 | 27 | NONTECH | CVL | location4 |
-------------------------------------------------------
*** EXPECTED RESULT ***
______________________________________________________
|NAME | AGE | ROLE | DEPARTMENT | LOCATION |
|________|______|____________|____________|___________|
|name2 | 25 | TECH | ELEC | location2 |
|name1 | 24 | TECH | MECH | location1 |
|name3 | 26 | TECH | COMP | location3 |
------------------------------------------------------
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Order;
public class OrderByField implements Order {
private Expression<?> expression;
@Override
public Order reverse() {
return null;
}
@Override
public boolean isAscending() {
return true;
}
@Override
public Expression<?> getExpression() {
return expression;
}
public OrderByField(CriteriaBuilder cb, List<Expression<?>> list) {
this.expression = cb.function("field", String.class, list.toArray(new Expression<?>[list.size()]));
}
}
Критерии logi c
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class);
Root<User> userData = criteriaQuery.from(User.class);
//Order By field DEPARTMENT
List<Expression<?>> departmentList = new ArrayList<>();
departmentList.add(userData.get("department"));
departmentList.add(builder.parameter(String.class, "param1"));
departmentList.add(builder.parameter(String.class, "param2"));
OrderByField order = new OrderByField(builder, departmentList); //custom class for ordeBy field
//WHERE CLUASE for location and role
List<Predicate> predicates = new ArrayList<>();
predicates.add(builder.like(userData.get("location"), "%" + "loc" + "%"));
predicates.add(builder.like(userData.get("role"), "%" + "TECH" + "%"));
criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()]));
criteriaQuery.orderBy(order);
TypedQuery<User> query = em.createQuery(criteriaQuery);
//ORDER BY FIELD PARAMS
query.setParameter("param1", "ELEC");
query.setParameter("param2", "MECH");
return query.getResultList();
** Сущность пользователя **
public class User {
@Column(name = "NAME")
private String name;
@Column(name = "AGE")
private String age;
@Column(name = "ROLE")
private String role;
@Column(name = "DEPARTMENT")
private String department;
@Column(name = "LOCATION")
private String location;
}