Missing constructor after JPA migration: Unable to locate appropriate constructor on class

Viewed 24

I have a general question regarding constructors in my entity classes for JPA. We just migrated from Hibernate's Criteria API (which did not need any constructor) to CriteriaBuilder and suddenly errors like that start to show up:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [com.myapp.mls.business.object.EventVOImpl]. Expected arguments are: long, java.lang.String, java.lang.String, java.lang.String, boolean, java.util.Date, java.lang.String, java.util.Date, java.lang.String, java.lang.String, java.lang.String, java.util.Date, int, java.lang.String, java.lang.String, boolean [select new com.myapp.mls.business.object.EventVOImpl(generatedAlias0.rowguid, generatedAlias0.path, generatedAlias0.denotation, generatedAlias0.status, generatedAlias0.scheduled, generatedAlias0.creationDate, generatedAlias0.creationUser, generatedAlias0.lastAction, generatedAlias0.sourceFilter, generatedAlias0.payloadFilter, generatedAlias0.interval, generatedAlias0.time, generatedAlias0.dayOfMonth, generatedAlias0.weekdays, generatedAlias0.notificationTemplatePath, generatedAlias0.runWithoutEvent) from com.myapp.mls.business.object.EventVOImpl as generatedAlias0 where ( generatedAlias0.scheduled=:param0 ) and ( generatedAlias0.status=:param1 )]
        at deployment.myapp.war//org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)
        at deployment.myapp.war//org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93)
        at deployment.myapp.war//org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:282)
        at deployment.myapp.war//org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:192)
        at deployment.myapp.war//org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)
        at deployment.myapp.war//org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113)
        at deployment.myapp.war//org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73)
        at deployment.myapp.war//org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162)
        at deployment.myapp.war//org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:636)
        at deployment.myapp.war//org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:748)

The rule that I grasp from the docs is that every entity should have a public no-args constructor:

public EventVOImpl() { }

Which I have added but the message still keeps appearing (and obviously does not refer to a no-args constructor). What is the basic solution to this issue? Create a constructor that includes all the fields of the VO? My underlying findBy method is very dynamic, which means developers can request any set of fields / projections from DB which would then require a different constructor?

What Is the general rule here regarding the args-constructors for JPA?

Here's the basic code that I run:

// Construct predicates
// Construct projections
cr.where(cb.and(predicates.toArray(new Predicate[0])));
Query query = getSession().createQuery(cr);
List<ENTITY> results = query.getResultList();

return results;
0 Answers
Related