2012-07-04 25 views
12

Tôi muốn thực hiện một số bộ lọc phổ quát với hibernate Criteria. Nó sẽ làm việc như like lệnh sql:Triển khai sql 'like' trong tiêu chí. Hibernate

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

Tôi có Map<String, String> nơi quan trọng là tên cột, và đánh giá cao giá trị của nó).

tôi đã cố gắng một cái gì đó như thế này:

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

Nhưng khi loại lĩnh vực không phải là String, nó couse 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] 

Có cách nào để giải quyết vấn đề này không?

+0

thông điệp ngoại lệ là gì? –

Trả lời

-1

Tôi khuyên bạn nên sử dụng Query object thay vì Criteria object, trong trường hợp này.

Tôi không thể nhớ nếu tiêu chí vượt qua mọi thứ nó không hiểu trực tiếp đến cơ sở dữ liệu như đối tượng truy vấn sẽ làm. Về cơ bản, điều này có nghĩa là nếu bạn sử dụng một hàm là cơ sở dữ liệu cụ thể mà trình phân tích cú pháp Hibernate không hiểu, nó sẽ truyền nó "như là" tới cơ sở dữ liệu.

Ví dụ:

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

Để biết thêm thấy here

+0

Bạn có thể hiển thị ví dụ nhỏ xin vui lòng. Đặc biệt là cách thực hiện phân loại – Divers

-1

khi loại lĩnh vực không phải là String, nó couse java.lang.ClassCastException

Thats vì nó chỉ làm việc với chuỗi/lĩnh vực varchar/cột.

+0

Vì vậy, có cách nào để thực hiện sql 'như' hành vi với tiêu chí? – Divers

+0

vâng tải các cách khác nhau, nhưng làm thế nào bạn sẽ "thích" một boolean ví dụ? Hoặc một số nguyên? Hay Foo? – NimChimpsky

+1

Giống như nó hoạt động trong sql. Ở đây bạn có thể chọn bất cứ điều gì không quan tâm về loại cột. – Divers

27

Bạn có thể sử dụng các tiêu chí cho việc sử dụng như

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

Nó sẽ cung cấp cho bạn danh sách các chuỗi mà bắt đầu bằng 'anyvalue'.

10

Bạn cũng có thể sử dụng DetachedCriteria khi không có phiên ngủ đông.

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

Nó sẽ phù hợp với giá trị bất cứ nơi nào trong cột chuỗi. Bạn có thể sử dụng các loại chế độ khác nhau.

trang tham khảo: https://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/criterion/MatchMode.html

DetachedCriteria:

- Tách rời tiêu chí là rất tốt thay thế khi phiên ngủ đông không có mặt.

Sử dụng tiêu chí tách biệt giống hệt như Tiêu chí ngoại trừ bạn có thể thực hiện việc tạo và thiết lập truy vấn ban đầu mà không cần truy cập vào phiên. Khi đến lúc chạy truy vấn của bạn, bạn phải chuyển đổi nó thành truy vấn có thể thực thi với getExecutableCriteria(session).

Điều này rất hữu ích nếu bạn đang xây dựng các truy vấn phức tạp, có thể thông qua quy trình nhiều bước, vì bạn không cần truy cập vào Phiên ở mọi nơi. Bạn chỉ cần phiên ở bước cuối cùng khi bạn chạy truy vấn.

Dưới mui xe, DetachedCriteria sử dụng CriteriaImpl là cùng một lớp bạn nhận được nếu bạn gọi session.createCriteria().

+0

MatchMode.ANYWHERE sẽ khớp với giá trị bất kỳ ở đâu trong chuỗi cột ... nhưng DetachedCriteria làm gì? –

+0

@DanielPatrick Vui lòng kiểm tra câu trả lời cập nhật của tôi .. – AppHouze

0

Sử dụng MatchMode enum để giúp bạn với nó:

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

Không sử dụng bất kỳ ký tự đặc biệt, như * Referencce Read This Like

Các vấn đề liên quan