2016-03-10 78 views
1

我有一個關於比較字符串值(它是存儲在db中作爲nvarchar的數字)和JPA Criteria API中的數字的問題。有沒有可能做到這一點?我已經嘗試過使用方法.as(Class),但它不起作用。它總是比較兩個字符串,而不是兩個數字。JPA Criteria API查詢中的字符串

編輯:

我在表中的列(名稱 - > fieldValue方法)。它存儲數字,但是以文本格式nvarchar。我想在JPA CriteriaApi中做出謂詞,它給了我這個表中的行,其中fieldValue大於某個值。我想:

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

但ID沒有工作

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