【发布时间】:2020-02-25 19:58:46
【问题描述】:
我使用 spring jpa 规范来动态构建实体查询。
它运行良好,但查询返回所有实体字段,这使性能变慢。 我只想获取特定的实体字段,而不是获取我不想要且不会使用的所有实体字段和依赖项。
我在网上搜索,我尝试了一些场景,但没有任何不足。 任何人都可以提出任何解决方案吗?
提前致谢
这就是我所拥有的。我正在使用 spring boot 2.2.4
public class Concert {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@Column
private String code;
@Column
private double totalIncome;
@Column
private double totalExpenses;
@Column
private double totalBudget;
@ManyToOne(targetEntity = Orchestra.class, fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "orchestra_id")
private Orchestra orchestra;
@ManyToOne(targetEntity = ConcertStatus.class, fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "concert_status_id")
private ConcertStatus status;
/* other fields */
}
规格:
public class ConcertSpecification implements Specification<Concert> {
@Override
public Predicate toPredicate(Root<Concert> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
//add add criteria to predicates
for (Criterion criteria : criteriaList) {
/* predicates builder here */
}
return builder.and(predicates.toArray(new Predicate[0]));
}
}
存储库:
public interface ConcertDao extends JpaRepository<Concert, Long>, JpaSpecificationExecutor<Concert>, PagingAndSortingRepository<Concert, Long> { }
音乐会服务:
public interface ConcertService {
Page<Concert> findAll(@Nullable Specification<Concert> spec, Pageable pageable);
}
ConcertServiceImpl:
@Service(value = "concertService")
public class ConcertServiceImpl implements ConcertService {
public Page<Concert> findAll(@Nullable Specification<Concert> spec, Pageable pageable){
List<Concert> list = new ArrayList<>();
concertDao.findAll(spec).iterator().forEachRemaining(list::add);
return new PageImpl<Concert>(list);
}
}
【问题讨论】:
-
您是否建议返回所有字段比返回记录的 n 个字段会导致性能下降?
-
是的。我有一些一对多的依赖项被获取。这会减慢查询速度,也会增加结果的大小。我希望它尽可能快且尺寸最小
标签: spring-data-jpa