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
Post a Comment