Sql - INTERSECT - Entity manager

0

Mam problem. chce pobrać z bazy listę wniosków, ktróre mają określone zadania skończone i jednocześnie określone zadania aktywne, więc próbowałem to zrobić za pomocą intersect:

select p
from main.proposal p join main.issue i on p.id = i.proposal_id
where issue_type in ('PAY_FUNDS_FOR_SUBJECT_IN_PROCESS', 'PAY_FUNDS_FOR_SUBJECT_END_PROCESS')
  and status = 'FINISHED_SUCCESS'
  and resolve_date <= '2021-03-25 13:30:00' and resolve_date >= '2021-03-24 13:30:00'
intersect
select p
from main.proposal p
         join main.issue i on p.id = i.proposal_id
  and (i.issue_type in ('MANUALLY_ADD_GPS_INSTALLATION_PROTOCOL', 'MANUALLY_REGISTER_SUBJECT',
                         'MANUALLY_ADD_INTERNAL_SIGNED_OFFER_DOCUMENT'))
  and i.status in ('NEW', 'INPROGRESS');

Okazało się że EM nie obsługuje intersecta.
Czy da się inaczej to obejść w jednym zapytaniu?

0

To zapytanie jest raczej bez sensu czy mi się wydaje? Robisz intersect na rozłącznych zbiorach (status_type są rozłączne). Może po prostu spróbuj z OR-em.

0

@Charles_Ray:Wnioski mogą mieć kilkanaście zadań na raz i mogą mieć pewne zadania skończone a pewne aktywne, założenie było takie aby znaleŹć część wspólną, w konsoli postgresa mi to ładnie działa.
Nie chce robić 2 zapytań i potem w jawie znajdywać wspólnych wniosków.

0

Ok, no to pisz native query, niech EM zwróci dtosy

1

@i1010011010: czemu robisz w ten sposób zamiast natywnym SQLem albo jakimś DSLem jak człowiek?
JdbcTemplate proponuje użyć.

0

@Charles_Ray: zrobiłem w ten sposób:

 @SuppressWarnings("unchecked")
    public List<Proposal> getProposalsByFinishedAndActiveIssues(List<IssueType> finishedSuccessIssueTypes,
                                                                List<IssueType> activeIssueTypes,
                                                                ZonedDateTime prolongedDateFrom,
                                                                ZonedDateTime prolongedDateTo) {
        return entityManager.createNativeQuery("select p " +
                "from main.proposal p join main.issue i on p.id = i.proposal_id " +
                "where issue_type in (:finishedIssueTypes) " +
                "  and status = :finishedSuccess " +
                "  and resolve_date <= :prolongedDateFrom and resolve_date >= :prolongedDateTo " +
                "intersect " +
                "select " +
                "from main.proposal " +
                "         join main.issue i on p.id = i.proposal_id " +
                "  and (i.issue_type in (:activeIssueTypes)) " +
                "  and i.status in (:activeStatuses)", Proposal.class)
                .setParameter("finishedIssueTypes", finishedSuccessIssueTypes)
                .setParameter("activeIssueTypes", activeIssueTypes)
                .setParameter("prolongedDateFrom", prolongedDateFrom)
                .setParameter("prolongedDateTo", prolongedDateTo)
                .setParameter("activeStatuses", Arrays.asList(IssueStatus.NEW, IssueStatus.INPROGRESS))
                .setParameter("finishedSuccess", IssueStatus.FINISHED_SUCCESS).getResultList();
    }

w logach poszedł mi taki błąd:

javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

1 użytkowników online, w tym zalogowanych: 0, gości: 1