java - Hibernate: Can't use a named parameter for OFFSET and LIMIT? -


i'm trying following namedquery work:

@namedquery(name="myentity.findbyuser", query="select m myentity m m.owner = :user offset :offset limit :limit") 

the problem causes hibernate explode following stack-trace upon server startup:

[info] [talledlocalcontainer] java.lang.nullpointerexception [info] [talledlocalcontainer]   @ org.hibernate.hql.ast.parametertranslationsimpl.getnamedparameterexpectedtype(parametertranslationsimpl.java:63) [info] [talledlocalcontainer]   @ org.hibernate.engine.query.hqlqueryplan.buildparametermetadata(hqlqueryplan.java:296) [info] [talledlocalcontainer]   @ org.hibernate.engine.query.hqlqueryplan.<init>(hqlqueryplan.java:97) [info] [talledlocalcontainer]   @ org.hibernate.engine.query.hqlqueryplan.<init>(hqlqueryplan.java:56) [info] [talledlocalcontainer]   @ org.hibernate.engine.query.queryplancache.gethqlqueryplan(queryplancache.java:72) [info] [talledlocalcontainer]   @ org.hibernate.impl.sessionfactoryimpl.checknamedqueries(sessionfactoryimpl.java:400) [info] [talledlocalcontainer]   @ org.hibernate.impl.sessionfactoryimpl.<init>(sessionfactoryimpl.java:351) [info] [talledlocalcontainer]   @ org.hibernate.cfg.configuration.buildsessionfactory(configuration.java:1291) [info] [talledlocalcontainer]   @ org.hibernate.ejb.ejb3configuration.buildentitymanagerfactory(ejb3configuration.java:713) [info] [talledlocalcontainer]   @ org.hibernate.ejb.hibernatepersistence.createentitymanagerfactory(hibernatepersistence.java:121) [info] [talledlocalcontainer]   @ javax.persistence.persistence.createentitymanagerfactory(persistence.java:83) [info] [talledlocalcontainer]   @ javax.persistence.persistence.createentitymanagerfactory(persistence.java:60) (...) 

after trial-and-error found replacing ":offset" , ":limit" literal values (0 , 10, respectively) worked fine. there reason this, , there way named parameters work in query?

i've seen other examples use positioned parameters dynamically set offset , limit values in named query, i'd rather not have code degenerate bunch of unreadable query.setparameter(1, "somevalue"); nonsense. named parameters supposed rid of kind of garbage code.

hibernate has special api specifying these concepts @ runtime. try this:

@namedquery(name="myentity.findbyuser",      query="select m myentity m m.owner = :user") // don't put offset or limit here  ...  entitymanager.createnamedquery("myentity.findbyuser")  .setfirstresult(20) // equivalent offset .setmaxresults(5) // equivalent limit .getresultlist(); 

i guess reason it's done way database vendors vary how , in sql query these concepts specified, it's not reasonable pick 1 format on another, , hard try convert between them.

this way, dialect implementation knows needs done, , can it.


Comments

Popular posts from this blog

c++ - Is it possible to compile a VST on linux? -

java - Output of Eclipse is rubbish -

jquery - Confused with JSON data and normal data in Django ajax request -