Я начал использовать CriteriaQuery и столкнулся с проблемой при создании очень простого запроса с предикатом.Ниже приведен упрощенный код для демонстрации использования. Идея состоит в том, чтобы найти всех людей, чей определенный атрибут (зарплата, возраст, итп.) Меньше указанного значения.
public List<Object> list(Session session, Class class, String propertyName, Long value) {
List<Predicate> predicates = ArrayList<>();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery query = builder.createQuery(class);
Root root = query.from(class);
query.select(root);
EntityType entityType_ = session.getMetamodel().entity(class);
predicates.add(builder.lt(root.get(entityType_.getSingularAttribute(propertyName)), value));
Predicate[] restrictions = new Predicate[predicates.size()];
query.where(mCrtBuilder.and(mPredicates.toArray(restrictions)));
return session.createQuery(query).getResultList();
}
Проблема в том, что это приводит к запросам String, которые выглядят так (просто пример):
select * from Person, где заработная плата <200000L </p>
Это 'L'после того, как сопоставимое значение добавляется к значению при отображении запроса в ValueHandlerFactory и приводит к исключению:
Причина: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: неизвестный столбец «200000L» в'where clause'
У кого-нибудь есть идеи, где я ошибаюсь?