CriteriaBuilder + Hibernate StatelessSession create sql

226 Views Asked by At

I am required to use StatelessSession because of the memory consumption when handling millions of rows and the method createQuery from sessions only accepts String.

The code looks like this:

StatelessSession session = ((Session) EntityManager
                    .getDelegate()).getSessionFactory().openStatelessSession();
                    
CriteriaBuilder criteriaBuilder = EntityManager
                    .getCriteriaBuilder();

CriteriaQuery<Concepts> queryConcepts = criteriaBuilder
                    .createQuery(Concepts.class);

Root<Concepts> rootConcepts = queryConcepts
                    .from(Concepts.class);
Root<TecAccountingExportTemp> rootExportTemp = queryConcepts
                    .from(ExportTemp.class);

rootConcepts.alias("a");
rootExportTemp.alias("b");

queryConcepts
         .select(rootConcepts);

Predicate fieldIdCab = criteriaBuilder
          .equal(rootConcepts
          .get(Concepts.XPTO_NAME),
                            rootExportTemp
                                    .get(ExportTemp.XPTO_NAME));

Predicate fieldKey = criteriaBuilder.equal(
                    rootExportTemp
                            .get(ExportTemp.KEY_NAME),
                    ExportTmpType.CONCEPTS.getValue());

Predicate fieldExportId = criteriaBuilder.equal(
                    rootExportTemp
                            .get(ExportTemp.ID_NAME),
                    tecAccountingExport.getId());

Predicate predicateFilter = criteriaBuilder.and(fieldIdCab,
                    fieldKey, fieldExportId);

queryConcepts.where(predicateFilter);
            
TypedQuery<Concepts> query = EntityManager
                    .createQuery(queryConcepts);
                    
                    
Query scrollQuery = query.unwrap(org.hibernate.Query.class);
                    

scrollconcepts = session
                    .createQuery(
                            scrollQuery.getQueryString()).setReadOnly(true)
                    .setFetchSize(maxCachedRecords).setCacheable(false)
                    .scroll(ScrollMode.FORWARD_ONLY);

The problem is that when the parameters are an instance of String, the scrollQuery.getQueryString() doesn't place the variable values correctly, they are like (xpto=:param1...) instead of what happens when the parameters are an instance of Integer (xpto=1 - correctly formating param1 as 1).

Can someone help me?

0

There are 0 best solutions below