JPA / Hibernate "Predicate" kombinieren in der gleichen Query

internet

Top Contributor
Hallo,

ich habe folgendes Problem:
Ich möchte von meinem Frontend Controller eine Query (WHERE Bedingung weitergeben an meine Datenbankschicht).

Ich meinem Frontend Controller generiere ich mir hierfür ein Predicate Objekt:
Java:
        List<Predicate> predicatesList = new ArrayList<>();
        JpaCriteriaHelper jpaCriteriaHelper = jpaUtilBean.createCriteriaBuilder(PicGallery.class);
        Root<PicGallery> itemRoot = jpaCriteriaHelper.getItemRoot();
        CriteriaBuilder criteriaBuilder = jpaCriteriaHelper.getCriteriaBuilder();

        predicatesList.add(criteriaBuilder.isFalse(itemRoot.get("deleteFlag")));

Das ist eine Hilfsklasse / Methode von jpaUtilBean, das mir ItemRoot und CriteryQuery / Builder generiert...
Code:
@SuppressWarnings({ "unchecked", "rawtypes" })
    public <T> JpaCriteriaHelper createCriteriaBuilder(Class<T> entityClass) {

        JpaCriteriaHelper jpaCriteriaHelper = new JpaCriteriaHelper();

        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        jpaCriteriaHelper.setCriteriaBuilder(criteriaBuilder);

        CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(entityClass);
        jpaCriteriaHelper.setCriteriaQuery(criteriaQuery);

        Root<T> itemRoot = criteriaQuery.from(entityClass);
        jpaCriteriaHelper.setItemRoot(itemRoot);

        return jpaCriteriaHelper;
    }

Da ich Primefaces verwende, wird ebenfalls hier eine neue Query erzeugt (siehe Implementierung von JpaLazyDataModel von Primefaces)

Siehe auch: https://primefaces.github.io/primefaces/12_0_0/#/components/datatable?id=lazy-loading
1658744224039.png

Ich habe nun mir eine Klasse erstellt, die mir eine Liste aus Predicate aus dem Controller durchschleift:
Code:
public class LazyLoadingHelper<T> {

    private JpaLazyDataModel jpaLazyDataModel;

    public LazyLoadingHelper(Class<T> entityClass, List<Predicate> predicatesList, EntityManager entityManager) {
        this.jpaLazyDataModel = createJpaLazyDataModel(entityClass, predicatesList, entityManager);
    }

    public <T> JpaLazyDataModel createJpaLazyDataModel(Class<T> entityClass, List<Predicate> predicatesList,
            EntityManager entityManager) {

        JpaLazyDataModel lazyModel = new JpaLazyDataModel<T>(entityClass, () -> entityManager, "id") {

            @Override
            protected void applyGlobalFilters(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<T> root,
                    List<Predicate> predicates) {

                if (predicatesList != null && !predicatesList.isEmpty()) {
                   
                    for(Predicate  p : predicatesList) {
                        Predicate finalQuery = cb.and(p);
                        predicates.add(finalQuery);
                    }
                }
            }

Das Problem ist nun aber, wenn ich die Predicate aus der Controller Klasse durchschleife, erhalte ich einen anderen Alias:

Invalid path: [select count(generatedAlias0) from de.test.model.MyClass as generatedAlias0 where generatedAlias1.deleteFlag = false]

Kann hier jemand helfen?
 
Du musst einen alias für das root-Objekt setzen, der an allen Stellen gleich lautet, an denen du Predicates generierst, die innerhalb der selben Query verwendet werden sollen. Also in deinem Frontend-Controller und deiner Hilfsklasse jeweils.

Java:
itemRoot.alias("myAlias");
 

Zurück
Oben