【问题标题】:Spring JPA query using specification and projection使用规范和投影的 Spring JPA 查询
【发布时间】: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


【解决方案1】:

不支持使用有规范的投影,有一个PR for it 已经挂了五年多了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2023-01-14
    • 2018-07-22
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多