Example usage for org.hibernate.query.criteria.internal.compile CriteriaQueryTypeQueryAdapter getParameterMetadata

List of usage examples for org.hibernate.query.criteria.internal.compile CriteriaQueryTypeQueryAdapter getParameterMetadata

Introduction

In this page you can find the example usage for org.hibernate.query.criteria.internal.compile CriteriaQueryTypeQueryAdapter getParameterMetadata.

Prototype

@Override
    public ParameterMetadata getParameterMetadata() 

Source Link

Usage

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);
}