Как получить отфильтрованные результаты на основе двух столбцов из одной таблицы с помощью построителя спецификаций и крJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как получить отфильтрованные результаты на основе двух столбцов из одной таблицы с помощью построителя спецификаций и кр

Сообщение Anonymous »

В настоящее время мне необходимо получить отфильтрованные результаты на основе двух столбцов из одной таблицы с помощью спецификации. Ниже я кратко объяснил модель данных и структуру сущностей.
У меня есть три разных сущности (таблица), как показано ниже:
  • EMPLOYEE
  • EMPLOYEE_HIKES
  • EMPLOYEE_HIKE_TYPE
Сотрудник.java

Код: Выделить всё

@Entity
@Table(name = "employee")
public  class Employee {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "EMP_ID")
private Integer employeeId;

@OneToMany
@JoinColumn(name = "EMPLOYEE_HIKE_ID")
private List employeeHike;

// some other entities mapping and other columns

// getters and setters
}
EmployeeHike.java

Код: Выделить всё

@Entity
@Table(name = "employee_hikes")
public  class EmployeeHike {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "EMPLOYEE_HIKE_ID")
private Integer hikeId;

@OneToOne
@JoinColumn(name = "HIKE_TYPE_ID")
private EmployeeHikeType hikeTypeId;

@Column(name = "IS_ACTIVE")
private Boolean isActive;

// getters and setters
}
EmployeeHikeType.java

Код: Выделить всё

@Entity
@Table(name = "employee_hike_type")
public  class EmployeeHikeType {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "HIKE_TYPE_ID")
private Integer hikeTypeId;

@Column(name = "HIKE_TYPE_NAME")
private String hikeTypename;

// some other columns

// getters and setters
}
Мой класс спецификации сотрудника выглядит следующим образом:
EmployeeSpecification.java

Код: Выделить всё

public class EmployeeSpecification implements Specification {

@Override
public Predicate toPredicate (Root, CriteriaQuery query, CriteriaBuilder cb) {
List
 predicates = new ArrayList();

Predicate hikeTypeIdPredicate = root.join("employeeHike").join("hikeTypeId").get(hikeTypeId).in();
Predicate hikeActivePredicate = root.join("employeeHike").get("isActive").in(1);

predicates.add(hikeActivePredicate);
predicates.add(hikeTypeIdPredicate);

// joins for other entities here

return cb.and(predicates.toArray(new Predicate[0]));
}
}
Ожидаемый результат: Я ожидаю список всех сотрудников, у которых есть активные повышения на основе значений типа повышения.
Фактический результат: Приведенный выше код возвращает список всех сотрудников на основе только значений типа повышения, и он не фильтруется на основе активного предиката.
Пожалуйста, прокомментируйте, если вам нужна дополнительная информация. Заранее спасибо за помощь.

Подробнее здесь: https://stackoverflow.com/questions/786 ... sing-speci
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»