2012-07-04 10 views
12

मैं हाइबरनेट Criteria के साथ कुछ सार्वभौमिक फ़िल्टर को कार्यान्वित करना चाहता हूं। यह काम करना चाहिए like आदेश की तरह एसक्यूएल है:मानदंडों में एसक्यूएल 'जैसे' लागू करें। हाइबरनेट

Select * from table where table.ANYCOLOUMNHERE like '%'||anyvaluehere||'%' 

जहां कुंजी स्तंभ नाम है मैं Map<String, String> है, और अपने मूल्य मूल्य)।

मैं कुछ इस तरह की कोशिश की:

for (Entry<String, String> filter : filters.entrySet()) { 
    crit.add(Restrictions.ilike(filter.getKey(), filter.getValue(), MatchMode.ANYWHERE)); 
} 

लेकिन जब फ़ील्ड प्रकार स्ट्रिंग नहीं है, यह java.lang.ClassCastException couse।

[com.nsn.util.LoggerUtilerror] (http-localhost-127.0.0.1-8080-1) Error while getting alarms: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long 
    at org.hibernate.type.descriptor.java.LongTypeDescriptor.unwrap(LongTypeDescriptor.java:36) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$1.doBind(BigIntTypeDescriptor.java:57) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:305) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:300) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1891) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1862) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1737) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.Loader.doQuery(Loader.java:828) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.Loader.doList(Loader.java:2447) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.Loader.doList(Loader.java:2433) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2263) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.Loader.list(Loader.java:2258) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:122) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1535) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:396) [hibernate-core-4.1.1.Final.jar:4.1.1.Final] 
    at com.nsn.entities_proccess.AlarmDAOImpl.getAlarms(AlarmDAOImpl.java:93) [classes:] 
    at com.nsn.boundary_process.LazyAlarmDataModel.load(LazyAlarmDataModel.java:50) [classes:] 
    at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:677) [primefaces-3.3.1.jar:] 
    at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:92) [primefaces-3.3.1.jar:] 
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:518) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at javax.faces.component.UIData.visitTree(UIData.java:1411) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIForm.visitTree(UIForm.java:371) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:297) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:981) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:391) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.7-jbossorg-2.jar:] 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] 
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:] 
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:] 
    at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_05] 

क्या इसे हल करने का यह तरीका है?

+0

अपवाद संदेश क्या है किसी विशेष वर्ण का उपयोग न करें? –

उत्तर

-1

मैं इस मामले में Criteria object के बजाय Query object का उपयोग करने की अनुशंसा करता हूं।

मुझे याद नहीं है कि मानदंड ऐसी चीजें पास करता है जो सीधे क्वेरी डेटाबेस के माध्यम से डेटाबेस के माध्यम से समझ में नहीं आता है। असल में इसका अर्थ यह होगा कि यदि आपने एक ऐसा फ़ंक्शन का उपयोग किया जो डेटाबेस विशिष्ट था जिसे हाइबरनेट पार्सर समझ में नहीं आया था, तो यह डेटाबेस के लिए "जैसा है" पास करेगा।

उदाहरण: और अधिक देखने

Query queryObject = session.createQuery("from ClassName where VARIABLENAME like '%'||anyvaluehere||'%' order by VARIABLENAME"); 
List<YourClass> resultList= queryObject.list(); 

लिए here

+0

पर लागू नहीं हैं, क्या आप कृपया छोटे उदाहरण दिखा सकते हैं। विशेष रूप से – Divers

-1

जब फ़ील्ड प्रकार स्ट्रिंग नहीं है, यह java.lang.ClassCastException

thats couse है क्योंकि यह केवल स्ट्रिंग/varchar क्षेत्रों/कॉलम के साथ काम करता है।

+0

तो क्या मानदंडों के साथ एसक्यूएल 'जैसे' व्यवहार को लागू करने का कोई तरीका है? – Divers

+0

हाँ विभिन्न तरीकों से भार, लेकिन उदाहरण के लिए आप एक बुलियन "पसंद" कैसे करेंगे? या एक इंटीजर? या फू? – NimChimpsky

+1

एसक्यूएल में काम करने की तरह। यहां आप स्तंभ प्रकार के बारे में परवाह नहीं करते कुछ भी चुन सकते हैं। – Divers

27

आप का उपयोग करने के लिए मानदंड का उपयोग कर सकते की तरह

session = sessionFactory.openSession(); 
Criteria query = session.createCriteria(Pojo.class); 
query.add(Restrictions.like("anycolumn", "anyvalue", MatchMode.START)); 

यह आप स्ट्रिंग की सूची जो 'anyvalue' से शुरू कर देंगे।

10

हाइबरनेट सत्र मौजूद नहीं होने पर आप डिटेक्टेडक्रिटिया का भी उपयोग कर सकते हैं।

DetachedCriteria criteria = DetachedCriteria.forClass(Pojo.class); 
criteria.add(Restrictions.like("column", value, MatchMode.ANYWHERE)); 

यह स्तंभ स्ट्रिंग में कहीं भी मूल्य से मेल खाएगी। आप विभिन्न प्रकार के मोड का उपयोग कर सकते हैं।

संदर्भ पेज: https://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/criterion/MatchMode.html

DetachedCriteria:

- अलग मापदंड बहुत अच्छा वैकल्पिक जब हाइबरनेट सत्र मौजूद नहीं है है।

एक पृथकक्रिटिया का उपयोग करना एक मानदंड के समान है, सिवाय इसके कि आप सत्र तक पहुंच के बिना अपनी क्वेरी के आरंभिक निर्माण और सेटअप को कर सकते हैं। जब आपकी क्वेरी चलाने का समय आता है, तो आपको इसे getExecutableCriteria(session) के साथ निष्पादन योग्य क्वेरी में परिवर्तित करना होगा।

यह उपयोगी है यदि आप जटिल प्रश्नों का निर्माण कर रहे हैं, संभवतः बहु-चरण प्रक्रिया के माध्यम से, क्योंकि आपको हर जगह सत्र तक पहुंच की आवश्यकता नहीं है। जब आप क्वेरी चलाते हैं तो आपको केवल अंतिम चरण में सत्र की आवश्यकता होती है।

हुड के तहत, डिटेक्टेडक्रिटियारिया एक मानदंड इंपल का उपयोग करता है जो आपको उसी श्रेणी में मिलता है यदि आप session.createCriteria() पर कॉल करते हैं।

+0

सॉर्टिंग को कार्यान्वित करने के लिए कैसे करें MatchMode.ANYWHERE कॉलम स्ट्रिंग में कहीं भी मान से मेल खाएगा ... लेकिन डिटेक्टेडक्रिटिया क्या करता है? –

+0

@DanielPatrick कृपया मेरे अपडेट किए गए उत्तर की जांच करें .. – AppHouze

0

इसके साथ आप मदद करने के लिए enum MatchMode का उपयोग करें:

मानदंड c1 = Restrictions.like ("AttributeName", "AttributeValue", MatchMode.END);

की तरह * Referencce Read This Like

संबंधित मुद्दे