web-dev-qa-db-ja.com

Hibernate CriteriaAPIのSQL「LIKE」演算子

Hibernate Criteriaでユニバーサルフィルターを実装したいと思います。 SQLのLIKE演算子のように機能するはずです。

SELECT * FROM table WHERE table.ANYCOLOUMNHERE LIKE '%'||anyvaluehere||'%'

私が持っています Map<String, String>ここで、keyは列名、valueはその値です。

私はこのようなことを試みました:

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

ただし、フィールドタイプがStringでない場合は、Java.lang.ClassCastException

[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]


これを解決する方法はありますか?

13
Divers

like() 制限基準は次のように使用できます。

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

anyvalue」で始まる文字列のリストが表示されます。

29
MayurB

DetachedCriteriaは、休止状態のセッションが存在しない場合にも使用できます。

_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:

-休止状態のセッションが存在しない場合、分離された基準は非常に優れた代替手段です。

DetachedCriteriaの使用は、セッションにアクセスせずにクエリの初期作成とセットアップを実行できることを除いて、Criteriaとまったく同じです。クエリを実行するときは、getExecutableCriteria(session)を使用して実行可能なクエリに変換する必要があります。

これは、どこからでもセッションにアクセスする必要がないため、おそらく複数ステップのプロセスを通じて複雑なクエリを作成する場合に役立ちます。クエリを実行するときの最終ステップでのみセッションが必要です。

内部的には、DetachedCriteriaは、session.createCriteria()を呼び出した場合に取得するのと同じクラスであるCriteriaImplを使用します。

12
AppHouze

列挙型MatchModeを使用して、次のことを支援します。

Criterion c1 = Restrictions.like("AttributeName", "AttributeValue", MatchMode.END);

*参照のような特殊文字は使用しないでください Read This Like

0
Shaam