【发布时间】:2020-08-10 00:58:06
【问题描述】:
当我使用 skuRepository.getAll() 时,它可以正常工作,但是当我应用在规范中定义的过滤器时 (List filteredRegs = skuRepository.getAll(specification)) 我仍然得到表的所有行 我应该怎么做才能将规范应用于我的自定义方法?
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();
}
更新: 这是我的实体。 当我使用 Specification API 按 Sku 表进行抽样时,我在日志中看到三个单独的选择:一个用于 Sku 实体,一个用于单元,一个用于供应商。我希望我的应用程序通过连接进行选择。 我读到这是由于我使用 EAGER 提取类型,所以我将其更改为 LAZY,但后来我遇到了另一个问题:“InvalidDefinitionException: No serializer found...”这是合乎逻辑的,因为相关实体 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
}
【问题讨论】: