Spring JPA-запрос с использованием спецификации и проекции - PullRequest
0 голосов
/ 25 февраля 2020

Я использовал спецификацию Spring jpa для динамического построения запроса сущностей.

Он работает отлично, но запрос возвращает все поля сущностей, что снижает производительность. Я хочу получить только указанные c поля сущностей, а не извлекать все поля сущностей и зависимости, которые мне не нужны и которые я не буду использовать.

Я ищу в Интернете, пробовал сценарий ios но без каких-либо недостатков. Может кто-нибудь предложить какое-либо решение по этому вопросу?

Заранее спасибо

Вот что у меня есть. Я использую пружинную загрузку 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> { }

ConcertService:

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);
    }
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...