List of usage examples for org.hibernate.query.criteria.internal.compile CriteriaQueryTypeQueryAdapter getParameterMetadata
@Override
public ParameterMetadata getParameterMetadata()
From source file:org.openvpms.component.business.dao.hibernate.im.query.MappedCriteriaQueryFactoryTestCase.java
License:Open Source License
/** * Verifies that building a query produces the expected results. * <p>/*from w w w. j a va2s . com*/ * NOTE: this is a brittle as it uses reflection to gain access to the generated parameters. * * @param query the criteria query * @param expected the expected JQL query * @param params the expected parameters * @throws Exception for any errors */ private <X> void checkQuery(CriteriaQuery<X> query, String expected, Object... params) throws Exception { MappedCriteriaQueryFactory builder = new MappedCriteriaQueryFactory(sessionFactory.getCriteriaBuilder(), assembler); MappedCriteriaQuery<X> criteriaQuery = builder.createCriteriaQuery((CriteriaQueryImpl<X>) query); javax.persistence.TypedQuery<?> typedQuery = session.createQuery(criteriaQuery.getQuery()); assertTrue(typedQuery instanceof CriteriaQueryTypeQueryAdapter); CriteriaQueryTypeQueryAdapter adapter = (CriteriaQueryTypeQueryAdapter) typedQuery; String queryString = adapter.getQueryString(); assertEquals(expected, queryString); Field queryField = FieldUtils.getDeclaredField(adapter.getClass(), "jpqlQuery", true); QueryImplementor<?> implementor = (QueryImplementor<?>) queryField.get(adapter); Field bindingField = FieldUtils.getDeclaredField(implementor.getClass(), "queryParameterBindings", true); QueryParameterBindings bindings = (QueryParameterBindings) bindingField.get(implementor); List<QueryParameter> parameters = new ArrayList<>(adapter.getParameterMetadata().getNamedParameters()); if (!parameters.isEmpty()) { // order the parameters on increasing id Collections.sort(parameters, new Comparator<QueryParameter>() { @Override public int compare(QueryParameter o1, QueryParameter o2) { return getId(o1.getName()) - getId(o2.getName()); } int getId(String name) { String id = name.replaceAll("\\D", ""); return id.isEmpty() ? 0 : Integer.parseInt(id); } }); } // verify parameters match that expected List<Object> actual = new ArrayList<>(); for (QueryParameter parameter : parameters) { QueryParameterBinding binding = bindings.getBinding(parameter); actual.add(binding.getBindValue()); } assertEquals(Arrays.asList(params), actual); }