Как получить одну строку моей таблицы, разделяющую внешний ключ с другими строками?(Проблема доступности) - PullRequest
0 голосов
/ 02 апреля 2019

В настоящее время я работаю над проектом по изучению основ Spring и SpringMVC. Я пытаюсь реализовать библиотеку и дать возможность одолжить несколько книг. У каждой книги есть несколько копий. Я работаю с таблицей h2, которая загружается каждый раз с maven, когда я запускаю проект, и который собирается с помощью mocks.

Моя таблица ссуд имеет атрибуты:

  • ссылка (ключ)
  • STARTDATE
  • ENDDATE
  • copyReference (который является внешним ключом)

Моя таблица копий имеет атрибуты:

  • ссылка (ключ)
  • код
  • BOOKTITLE ...

    Мой вопрос: как я могу запросить в Спецификации мои таблицы, чтобы получить в таблице ссуд доступные копии. Это значит, что копия доступна только в том случае, если ее endDate более поздний, чем сегодня, и в данный момент она не ссужается, поэтому в любых других строках с той же ссылкой copyReference после сегодняшнего дня.

Я попробовал несколько спецификаций, но думаю, что ближе:

    public Predicate toPredicate() {
        QCopyEntity copy = QCopyEntity.copyEntity;

        return copy.libraryReference.eq(this.libraryReference)
                .and(copy.publicationReference.eq(this.publicationReference))
                .and(neverLoanedCase())
                .or(alreadyLoanedCase());
    }

    private Predicate neverLoanedCase() {
        QLoanEntity loan = QLoanEntity.loanEntity;
        return (loan.copyReference.isNull())
                .and(loan.endDate.after(LocalDate.now())
                        .or(loan.endDate.isNull()));

    }

    private Predicate alreadyLoanedCase() {
        QLoanEntity loan = QLoanEntity.loanEntity;
        QCopyEntity copy = QCopyEntity.copyEntity;


        return loan.copyReference.eq(copy.reference)
                .and(loan.endDate.eq(LocalDate.now())
                        .or(loan.endDate.before(LocalDate.now()))
                .and(loan.endDate.after(LocalDate.now()).not()));
    }

И в моем репозитории у меня есть следующий JPAQueryFactory:

List<CopyEntity> copyEntities = new JPAQueryFactory(this.entityManager)
                .from(copyEntity)
                .leftJoin(loanEntity)
                .on(copyEntity.reference.eq(loanEntity.copyReference))
                .orderBy(copyEntity.code.asc())
                .where(((QuerydslPredicateSpecification) specification).toPredicate())
                .select(copyEntity)
                .distinct()
                .fetch();

В моем веб-просмотре он отлично работает, когда это начало, но если я одалживаю копию, «закройте» ссуду (установите дату окончания на сегодня), чтобы снова сделать ее доступной, она всегда будет отображаться доступной, поскольку она соответствует условиям true.

loan.endDate.eq(LocalDate.now())

даже если это заем во второй раз, потому что в одной строке таблицы это правда. Надеюсь, я дал понять, спасибо за любую помощь, которую вы можете оказать.

Редактировать Решив это, изменив смысл своего запроса, я ищу все открытые кредиты и беру остальное

    public Predicate toPredicate() {
        QCopyEntity copy = QCopyEntity.copyEntity;
        QLoanEntity loan = QLoanEntity.loanEntity;

        return copy.libraryReference.eq(this.libraryReference)
                .and(copy.publicationReference.eq(this.publicationReference))
                .and(JPAExpressions.select()
                        .from(loan)
                        .where(loan.copyReference.eq(copy.reference)
                                .and(loan.endDate.after(LocalDate.now())))
                        .notExists());
    }
...