【问题标题】:Strings in JPA Criteria API QueriesJPA Criteria API 查询中的字符串
【发布时间】:2016-06-25 21:08:25
【问题描述】:

我有一个关于将字符串值(它是作为 nvarchar 存储在 db 中的数字)与 JPA Criteria API 中的数字进行比较的问题。有没有可能做到这一点?我已经尝试过使用方法 .as(Class),但它没有用。它总是比较两个字符串,而不是两个数字。

编辑:

我在表中有一个列(名称 -> 字段值)。它存储数字,但以文本格式 nvarchar。我想在 JPA CriteriaApi 中创建谓词,为我提供该表中的行,其中 fieldValue 大于某个值。我试过了:

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

但 id 不起作用

【问题讨论】:

  • “它不起作用”。这告诉人们很多。没想到他们想知道生成了什么 SQL,或者你遇到了什么异常?

标签: jpa criteria-api


【解决方案1】:

一种可能性是使用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);

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2012-08-19
    • 2011-10-17
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多