Spring критерий запроса в предложении - PullRequest
0 голосов
/ 01 апреля 2020

У меня следующая проблема с моим проектом springboot:

Я создаю запрос критерия с элементами фильтра,

это код:

    public List<IncidentMinimalPOJO> getPOJOFiltered(FilterPOJO filterValue) {

        List<IncidentMinimalPOJO> resultListPOJO = null;
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Incident> cq = cb.createQuery(Incident.class);

        List<Predicate> predicates = new ArrayList<>();
        Root<Incident> root = cq.from(Incident.class);


        if (filterValue.getInfodesk() != null) {
            Predicate infoDesk = cb.equal(root.get("infoDesk"),filterValue.getInfodesk());
            predicates.add(infoDesk);
        }

        if (filterValue.getAgencyImpact() != null) {
            Predicate agencyImpact = cb.equal(root.get("agencyImpact"),filterValue.getAgencyImpact());
            predicates.add(agencyImpact);
        }

        // this is the wrong part!!!!!!!
        if (filterValue.getTeam() != null) {
            In<Team> teamIn = cb.in(root.get("teams"));
            for (Team team : filterValue.getTeam()) {
                teamIn.value(team);
            }
            predicates.add(teamIn);
        }   

        if (predicates.size() > 0) {
            Predicate dateDeleteNull = cb.isNull(root.get("dateDelete"));
            predicates.add(dateDeleteNull);
            cq.where(predicates.toArray(new Predicate[predicates.size()]));
            TypedQuery<Incident> query = em.createQuery(cq);
            List<Incident> resultList = query.getResultList();
            if (resultList != null) {
                resultListPOJO = new ArrayList<>();
                for (Incident incident : resultList) {
                    IncidentMinimalPOJO incidentPOJO = factoryMinimalPOJO(incident);
                    resultListPOJO.add(incidentPOJO);
                }
                return resultListPOJO;
            } else {
                return new ArrayList<>();
            }
        } else {
            return this.getAllMinimalPOJO();
        }
    }

когда запрос работает с простым классом, таким как 'AgencyImpact' (это байт), проблем нет, но когда я пытаюсь сделать предложение where для объекта типа 'Team', у меня возникает несколько ошибок, я не могу понять, как запрос критериев работы с предложением in для поля tha имеет отношение ManyToMany.

Это сущность:

@Entity
@NamedQuery(name="Incident.findAll", query="SELECT i FROM Incident i")
public class Incident implements Serializable {

    private static final long serialVersionUID = 769582462646072429L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_incident")
    private int idIncident;

    private String action;

    private String cause;

    @Lob
    private String note;

    //bi-directional many-to-many association to Team
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(
        name="incident_team"
        , joinColumns={
            @JoinColumn(name="id_incident")
            }
        , inverseJoinColumns={
            @JoinColumn(name="id_team")
            }
        )
    private Set<Team> teams;


надеюсь, все почти ясно, спасибо за помощь!

...