Когда я использую skuRepository.getAll (), он работает нормально, но когда я применяю фильтры, определенные в Спецификации (Список FilterRegs = skuRepository.getAll (спецификация)), я все равно получаю все строки таблицы Что мне делать, чтобы применить спецификации к моему пользовательскому методу?
public interface SkuRepository extends CrudRepository<Sku, Integer>, JpaSpecificationExecutor<Sku> {
@Query("select s from Sku s join fetch s.unit un join fetch s.supplier sup WHERE un.id = sku_unit_id AND sup.id = supplier_id")
List<Sku> getAll(@Nullable Specification<Sku> var1);
@Query("select s from Sku s join fetch s.unit un join fetch s.supplier sup WHERE un.id = sku_unit_id AND sup.id = supplier_id")
List<Sku> getAll();
}
UPD: Вот мои сущности. Когда я делаю выборку по таблице Sku с использованием API спецификации, я вижу три отдельных выбора в журнале: один для объекта Sku, один для модуля и один для поставщиков. Я хочу, чтобы мое приложение делало выбор с помощью объединений. Я прочитал, что это связано с тем, что я использую тип выборки EAGER, поэтому я изменяю его на LAZY, но потом у меня возникла другая проблема: «InvalidDefinitionException: не найден сериализатор ...» Это логично, потому что связанные объекты Unit и Supplier являются не загружен Тогда я решил написать свой собственный getAll () с запросом:
@Query("select s from Sku s join fetch s.unit un join fetch s.supplier sup WHERE un.id = sku_unit_id AND sup.id = supplier_id ORDER BY s.name")
Но теперь он не поддерживает спецификацию. Посоветуйте пожалуйста что делать.
@Entity
@Table(name = "sku")
public class Sku implements Cloneable, CloneableEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "sku_code", length = 6, nullable = false, unique = true)
private String code;
@Column(name = "sku_name", nullable = false)
private String name;
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "sku_unit_id", nullable = false)
private Unit unit;
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "supplier_id", nullable = false)
private Supplier supplier;
@Column(name = "qty_in_sec_pkg")
private int quantityInSecondaryPackaging;
@Column(name = "sku_is_active", nullable = false)
private boolean isActive;
//constructors, getters, setters
}
@Entity
@Table(name = "units")
public class Unit {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id ")
private int id;
@Column(name = "unit", nullable = false, unique = true)
private String unit;
@Column(name = "description")
private String description;
//constructors, getters, setters
}
@Entity
@Table(name = "suppliers")
public class Supplier {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id ")
private int id;
@Column(name = "supplier_code", length = 6, nullable = false, unique = true)
private String supplierCode;
@Column(name = "supplier_name", nullable = false)
private String name;
@Column(name = "create_date", length = 19, nullable = false)
private String createDate;
@Column(name = "update_date", length = 19)
private String updateDate;
//constructors, getters, setters
}