Hi I am migration to hibernate 6 and I am getting this error
java.lang.IllegalArgumentException: Already registered a copy: SqmBasicValuedSimplePath(ca.ulaval.gin.attribut.AttributEntity(318348975481600).dateDebutEffet)
this is m y code
public ResultatPartielAvecTotal<AttributEntity> findBy(CriteresRechercheAttribut criteres, Pagination pagination) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<AttributEntity> query = criteriaBuilder.createQuery(AttributEntity.class);
Root<AttributEntity> root = query.from(AttributEntity.class);
CriteresRechercheAttributToJpaConverter criteresRechercheAttributToJpaConverter = new CriteresRechercheAttributToJpaConverter(root, criteriaBuilder);
query.where(criteresRechercheAttributToJpaConverter.toPredicat(criteres, query));
query.orderBy(toOrder(pagination.getTri(), root, criteriaBuilder));
CriteriaQuery<Long> queryCount = criteriaBuilder.createQuery(Long.class);
queryCount.select(criteriaBuilder.count(queryCount.from(AttributEntity.class)))
.where(criteresRechercheAttributToJpaConverter.toPredicat(criteres, queryCount));
return new ResultatPartielAvecTotal<>(
entityManager.createQuery(query)
.setMaxResults(pagination.getTaillePage())
.setFirstResult(pagination.getIndexRecuperationElements())
.getResultList(),
entityManager.createQuery(queryCount).getSingleResult());
}
this is the toPredicat method
public Predicate[] toPredicat(CriteresRechercheAttribut criteres, CriteriaQuery<?> query) {
List<Predicate> predicats = new ArrayList<>();
Subquery<LocalDateTime> subqueryMaxDateDebut = query.subquery(LocalDateTime.class);
Root<AttributEntity> rootSubQuery = subqueryMaxDateDebut.from(AttributEntity.class);
Path<LocalDateTime> pathDateDebutEffet = rootSubQuery.get("dateDebutEffet");
subqueryMaxDateDebut.select(criteriaBuilder.greatest(pathDateDebutEffet))
.where(criteriaBuilder.equal(root.get("code"), rootSubQuery.get("code")));
predicats.add(criteriaBuilder.equal(root.get("dateDebutEffet"), subqueryMaxDateDebut));
if (!criteres.code.isEmpty()) {
predicats.add(criteriaBuilder.equal(root.get("code"), criteres.code));
}
if (Boolean.TRUE.equals(criteres.isActif)) {
predicats.add(criteriaBuilder.isNull(root.get("dateFinEffet")));
} else if (Boolean.FALSE.equals(criteres.isActif)) {
predicats.add(criteriaBuilder.isNotNull(root.get("dateFinEffet")));
}
return predicats.toArray(new Predicate[predicats.size()]);
}
I tried to do like what was done here https://discourse.hibernate.org/t/possible-regression-5-6-to-6-1-sqmroot-not-yet-resolved-to-tablegroup/6554/21
public Predicate[] toPredicat(CriteresRechercheAttribut criteres, CriteriaQuery<?> query) {
List<Predicate> predicats = new ArrayList<>();
SqmSubQuery<LocalDateTime> subqueryMaxDateDebut = (SqmSubQuery<LocalDateTime>) query.subquery(LocalDateTime.class);
var sqmOriginalQuery = (SqmSelectStatement) query;
var sqmOriginalQuerySpec = sqmOriginalQuery.getQuerySpec();
var sqmSubQuerySpec = sqmOriginalQuerySpec.copy(SqmCopyContext.simpleContext());
subqueryMaxDateDebut.setQueryPart(sqmSubQuerySpec);
Root<AttributEntity> rootSubQuery = subqueryMaxDateDebut.from(AttributEntity.class);
Path<LocalDateTime> pathDateDebutEffet = rootSubQuery.get("dateDebutEffet");
subqueryMaxDateDebut.select(criteriaBuilder.greatest(pathDateDebutEffet))
.where(criteriaBuilder.equal(root.get("code"), rootSubQuery.get("code")));
predicats.add(criteriaBuilder.equal(root.get("dateDebutEffet"), subqueryMaxDateDebut));
if (!criteres.code.isEmpty()) {
predicats.add(criteriaBuilder.equal(root.get("code"), criteres.code));
}
if (Boolean.TRUE.equals(criteres.isActif)) {
predicats.add(criteriaBuilder.isNull(root.get("dateFinEffet")));
} else if (Boolean.FALSE.equals(criteres.isActif)) {
predicats.add(criteriaBuilder.isNotNull(root.get("dateFinEffet")));
}
return predicats.toArray(new Predicate[predicats.size()]);
}
but I don’t seem to have a good understanding of that because Ikeep having the same issue
thank you