2016-03-10 3 views
1

У меня возник вопрос о сравнении значения String (это число, хранящееся в db как nvarchar) с номером в API-интерфейсе JPA. Есть ли возможность сделать это? Я пробовал использовать метод .as (Class), но это не сработало. Он всегда сравнивает две строки, а не два числа.Строки в запросах API-запросов JPA

EDIT:

У меня есть столбец в таблице (имя -> fieldValue). Он хранит числа, но в текстовом формате nvarchar. Я хочу сделать предикат в JPA CriteriaApi, который даст мне строки из этой таблицы, в которых fieldValue больше некоторого значения. Я пробовал:

criteriaBuilder.gt(c.get("fieldValue").as(Long.class), someValue); 

но идентификатор не работает

+0

«Это не сработало». Это многое говорит людям. Никогда не думал, что они хотели бы знать, какой SQL был создан, или какое исключение вы получили? –

ответ

0

Одной из возможностей является аннотирования свойство с Converter класса. Таким образом, поле Java Entity является Long, но столбец базы данных является String.

@Converter 
public class LongToStringConverter implements AttributeConverter<Long,String> { 
    @Override 
    public String convertToDatabaseColumn(Long attribute) { 
     return attribute.toString(); 
    } 
    @Override 
    public Long convertToEntityAttribute(String dbData) { 
     return Long.parseLong(dbData); 
    } 
} 

С этим, CriteriaQuery довольно прямолинейно.

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Entity> q = cb.createQuery(Entity.class); 
Root<Entity> l = q.from(Entity.class); 
q.select(l).where(cb.equal(l.get("fieldValue"), 12344321L)); 
Entity r = em.createQuery(q).getSingleResult(); 
System.out.println(r);