Search code examples
vaadin7natty

Vaadin Combobox filtering issue with jpacontainer datasouce


Can any one help me to solve the tricky issue here,I have set jpacontainer as datasource for vaadin combobox and also set filtering mode to it, but filtering is not working and its throws an exception here.

Code:

JPAContainer<PersonMaster> personMasterContainer = new JPAContainer<>(PersonMaster.class);
personMasterContainer.setEntityProvider(dataService.getPersonMasterService());

ComboBox createEntitySelect = new ComboBox("Entity",personMasterContainer);
createEntitySelect.setContainerDataSource(personMasterContainer);
createEntitySelect.setItemCaptionPropertyId("personName");
createEntitySelect.setFilteringMode(ComboBox.FILTERINGMODE_CONTAINS);
createEntitySelect.setImmediate(true);

Exception stacktrace:

SEVERE: EjbTransactionUtil.handleSystemException: The filter listener "matches" requires a constant argument.
<openjpa-2.4.0-r422266:1674604 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: The filter listener "matches"requires a constant argument.     
at org.apache.openjpa.jdbc.kernel.exps.JDBCExpressionFactory.matches(JDBCExpressionFactory.java:276)
at org.apache.openjpa.persistence.criteria.Expressions$Like.toKernelExpression(Expressions.java:1265)
at org.apache.openjpa.persistence.criteria.PredicateImpl.toKernelExpression(PredicateImpl.java:166)
at org.apache.openjpa.persistence.criteria.CriteriaExpressionBuilder.evalFilter(CriteriaExpressionBuilder.java:215)
at org.apache.openjpa.persistence.criteria.CriteriaExpressionBuilder.getQueryExpressions(CriteriaExpressionBuilder.java:75)
at org.apache.openjpa.persistence.criteria.CriteriaQueryImpl.getQueryExpressions(CriteriaQueryImpl.java:423)
at org.apache.openjpa.persistence.criteria.CriteriaBuilderImpl.eval(CriteriaBuilderImpl.java:81)
at org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.<init>(ExpressionStoreQuery.java:763)
at org.apache.openjpa.kernel.ExpressionStoreQuery.newDataStoreExecutor(ExpressionStoreQuery.java:179)
at org.apache.openjpa.kernel.QueryImpl.createExecutor(QueryImpl.java:748)
at org.apache.openjpa.kernel.QueryImpl.compileForDataStore(QueryImpl.java:706)
at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:688)
at org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1528)
at org.apache.openjpa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:123)
at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:268)
at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:290)
at org.apache.openjpa.persistence.QueryImpl.getSingleResult(QueryImpl.java:318)
at com.vaadin.addon.jpacontainer.provider.LocalEntityProvider.doGetEntityCount(LocalEntityProvider.java:543)
at com.vaadin.addon.jpacontainer.provider.LocalEntityProvider.getEntityCount(LocalEntityProvider.java:547)
at sun.reflect.GeneratedMethodAccessor66.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)

Solution

  • The error

    The filter listener "matches" requires a constant argument

    is given in openjpa when you try to do a like operation with an expression such as cb.lower(value) as the second argument. You can omit the lower operator alltogether since

    MySQL DB - 'like' operator is used in a case insensitive manner

    so you can write something like the following line:

    Predicate condition = cb.like(cb.lower(field), "%" + value+ "%");
    

    and it should work as expected.

    source that aided me in finding the root cause