Vaadin Combobox filtering issue with jpacontainer datasouce

107 Views Asked by At

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)
1

There are 1 best solutions below

0
On BEST ANSWER

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