在JpaRepository接口中实现自定义查询的时候,必然会遇到一个问题,通过findBy等语句查询出来的结果通常情况下不会加载到关联的实体。例如我有一个Material类,其中有一个属性supplier使用了多对一关联到Supplier类,并开启懒加载,查询出来结果后,material.getSupplier()会单独查询一次数据库,这样很多场景下效率有所降低。
最近发现了一个@EntityGraph注解,在接口中通过@EntityGraph注解来指定加载策略,这可以在不改变实体默认加载策略的情况下,为特定的查询方法指定加载行为,这样SQL直接就会关联到另一张表,当需要使用这个实体的时候就不会再次查询数据库了。
@Entity
@Table(name = "bc_material")
public class Material {private Integer no; // 编号private Supplier supplier; // 默认厂商/*** @return 默认厂商*/@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)@JoinColumn(name = "supplierId", referencedColumnName = "id")public Supplier getSupplier() {return supplier;}/*** @param 默认厂商*/public void setSupplier(Supplier supplier) {this.supplier = supplier;}/* 其他部分简化 */}
public interface MaterialRepository extends JpaRepository<Material, String> {@EntityGraph(attributePaths = {"supplier"})List<Material> findByNameIn(List<String> nameList);}