i working jpa2 , i'm looking write search query models sql query
select c., t. campaigns c, campaign_tags ct, tags t c.id = ct.campaign_id , t.id = ct.tag_id , t.name in ('buzz','blitzy');
here classes
class campaign { @manytomany(cascade = {cascadetype.all}) @jointable(name = "campaign_tags", joincolumns = @joincolumn(name = "campaign_id"), inversejoincolumns = @joincolumn(name = "tag_id") ) private set<tag> tags; } class tag{ @id private string id; @column private string name; }
i'm using criteria builder write predicates , specifications can use search through jpa resository.. following code not work.
public static specification<campaign> hastags(string searchterm) { return (root, query, cb) -> { //searchterm contacts tagnames represented comma separated strings list<string> list = new arraylist<string>(arrays.aslist(searchterm.split(","))); criteriaquery<tag> cq = cb.createquery(tag.class); root<campaign> rootanswer = cq.from(campaign.class); join<tag,campaign> joinanswercollaborator = rootanswer.join("tags"); return joinanswercollaborator.in(list); }; }
i error:
com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception: unknown column 'generatedalias1' in 'where clause' @ sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method) @ sun.reflect.nativeconstructoraccessorimpl.newinstance(nativeconstructoraccessorimpl.java:62) @ sun.reflect.delegatingconstructoraccessorimpl.newinstance(delegatingconstructoraccessorimpl.java:45) @ java.lang.reflect.constructor.newinstance(constructor.java:422) @ com.mysql.jdbc.util.handlenewinstance(util.java:389) @ com.mysql.jdbc.util.getinstance(util.java:372) @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:980) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3835) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3771) @ com.mysql.jdbc.mysqlio.sendcommand(mysqlio.java:2435) @ com.mysql.jdbc.mysqlio.sqlquerydirect(mysqlio.java:2582) @ com.mysql.jdbc.connectionimpl.execsql(connectionimpl.java:2535) @ com.mysql.jdbc.preparedstatement.executeinternal(preparedstatement.java:1911) @ com.mysql.jdbc.preparedstatement.executequery(preparedstatement.java:2034) @ org.hibernate.engine.jdbc.internal.resultsetreturnimpl.extract(resultsetreturnimpl.java:82) @ org.hibernate.loader.loader.getresultset(loader.java:2066) @ org.hibernate.loader.loader.executequerystatement(loader.java:1863) @ org.hibernate.loader.loader.executequerystatement(loader.java:1839) @ org.hibernate.loader.loader.doquery(loader.java:910) @ org.hibernate.loader.loader.doqueryandinitializenonlazycollections(loader.java:355) @ org.hibernate.loader.loader.dolist(loader.java:2554) @ org.hibernate.loader.loader.dolist(loader.java:2540) @ org.hibernate.loader.loader.listignorequerycache(loader.java:2370) @ org.hibernate.loader.loader.list(loader.java:2365) @ org.hibernate.loader.hql.queryloader.list(queryloader.java:497) @ org.hibernate.hql.internal.ast.querytranslatorimpl.list(querytranslatorimpl.java:387) @ org.hibernate.engine.query.spi.hqlqueryplan.performlist(hqlqueryplan.java:236) @ org.hibernate.internal.sessionimpl.list(sessionimpl.java:1300) @ org.hibernate.internal.queryimpl.list(queryimpl.java:103) @ org.hibernate.jpa.internal.queryimpl.list(queryimpl.java:573) @ org.hibernate.jpa.internal.queryimpl.getresultlist(queryimpl.java:449) @ org.hibernate.jpa.criteria.compile.criteriaquerytypequeryadapter.getresultlist(criteriaquerytypequeryadapter.java:67) @ org.springframework.data.jpa.repository.support.simplejparepository.findall(simplejparepository.java:387) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:497) @ org.springframework.data.repository.core.support.repositoryfactorysupport$queryexecutormethodinterceptor.executemethodon(repositoryfactorysupport.java:436) @ org.springframework.data.repository.core.support.repositoryfactorysupport$queryexecutormethodinterceptor.doinvoke(repositoryfactorysupport.java:421) @ org.springframework.data.repository.core.support.repositoryfactorysupport$queryexecutormethodinterceptor.invoke(repositoryfactorysupport.java:393) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.data.repository.core.support.repositoryfactorysupport$defaultmethodinvokingmethodinterceptor.invoke(repositoryfactorysupport.java:506) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.transaction.interceptor.transactioninterceptor$1.proceedwithinvocation(transactioninterceptor.java:99) @ org.springframework.transaction.interceptor.transactionaspectsupport.invokewithintransaction(transactionaspectsupport.java:281) @ org.springframework.transaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:96) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.dao.support.persistenceexceptiontranslationinterceptor.invoke(persistenceexceptiontranslationinterceptor.java:136) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.data.jpa.repository.support.crudmethodmetadatapostprocessor$crudmethodmetadatapopulatingmethodintercceptor.invoke(crudmethodmetadatapostprocessor.java:122) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.aop.interceptor.exposeinvocationinterceptor.invoke(exposeinvocationinterceptor.java:92) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.aop.framework.jdkdynamicaopproxy.invoke(jdkdynamicaopproxy.java:207) @ com.sun.proxy.$proxy88.findall(unknown source) @ com.irispr.controllers.searchcontroller.searchcampaigns(searchcontroller.java:98) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:497) @ org.springframework.web.method.support.invocablehandlermethod.doinvoke(invocablehandlermethod.java:221) @ org.springframework.web.method.support.invocablehandlermethod.invokeforrequest(invocablehandlermethod.java:137) @ org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:110) @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlemethod(requestmappinghandleradapter.java:776) @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:705) @ org.springframework.web.servlet.mvc.method.abstracthandlermethodadapter.handle(abstracthandlermethodadapter.java:85) @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:959) @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:893) @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:967) @ org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:858) @ javax.servlet.http.httpservlet.service(httpservlet.java:622) @ org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:843) @ javax.servlet.http.httpservlet.service(httpservlet.java:729) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:291) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.tomcat.websocket.server.wsfilter.dofilter(wsfilter.java:52) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:239) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.springframework.web.filter.hiddenhttpmethodfilter.dofilterinternal(hiddenhttpmethodfilter.java:77) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:239) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:85) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:239) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:219) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:106) @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:502) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:142) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:79) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:88) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:518) @ org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1091) @ org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:668) @ org.apache.tomcat.util.net.nioendpoint$socketprocessor.dorun(nioendpoint.java:1521) @ org.apache.tomcat.util.net.nioendpoint$socketprocessor.run(nioendpoint.java:1478) @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1142) @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:617) @ org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61) @ java.lang.thread.run(thread.java:745)
your specification should this:
new specification<campaign>() { @override public predicate topredicate(root<campaign> root, criteriaquery<?> cq, criteriabuilder cb) { list<string> list = new arraylist<>(arrays.aslist(searchterm.split(","))); join join = root.join("tags"); return join.get("name").in(list); } }
you don't have create new criteria query or root, have them passed in parameters of method topredicate.
Comments
Post a Comment