Как написать собственный findAll () со спецификацией в репозитории JPA - PullRequest
0 голосов
/ 26 апреля 2020

Когда я использую 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
}

1 Ответ

0 голосов
/ 26 апреля 2020

Вы не можете смешивать @Query и спецификацию

Вы можете использовать только JpaSpecificationExecutor методы интерфейса для использования спецификации.

Найти более подробную информацию здесь

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