JPA条件API函数转换或强制转换

时间:2014-01-29 15:37:42

标签: java sql hibernate jpa

我正在尝试将以下SQL转换为CriteriaBuilder代码

SQL:

SELECT * FROM logging WHERE CONVERT(log_action, CHAR(100)) = 'delete'

log_action定义为varbinary(32)。

CODE:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Logging> query = cb.createQuery(Logging.class);
Root<Logging> from = query.from(Logging.class);
Expression<Byte> path = from.get("logAction");
Expression<String> convertFunction = cb.function("CONVERT", String.class, path);

query.select(from);

Predicate predicate = cb.equal(convertFunction, "delete");

query.where(predicate);

return em.createQuery(query).getResultList();

任何想法我做错了什么?

谢谢,

肖恩

2 个答案:

答案 0 :(得分:2)

使用CriteriaQuery的函数方法尝试了很多。我被困了,因为

private static final String PG_TRANSLATE_TO = "char(100)";
    ParameterExpression<String> p = cb.parameter(String.class,"param0" );
Expression<String> convertFunction = cb.function("CONVERT", String.class, from.get("log_action"), p);

始终连接char(100),但使用引号'char(100)',然后出现SQL错误。

错误代码:1064。您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在第1行''char(100)')='delete''附近使用正确的语法

所以我决定直接对条件进行Criteria查询,因为它们在开头就是String。 并使用以下代码。

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery <Logging> query = cb.createQuery(Logging.class);

    ParameterExpression<String> p = cb.parameter(String.class,"param0" );
    Root<Logging> from = query.from(Logging.class);

    query.select(from);
        query.where( cb.equal(from.get("log_action"), "delete".getBytes()));

    System.out.println(em.createQuery(query).getResultList());

这确实有效

Hibernate:选择logging0_.log_id为log1_3_,logging0_.log_action为log2_3_,logging0_.log_type为log3_3_,来自logging logging0_,其中logging0_.log_action =?

[记录[log_id = 1,log_type = delete,log_action = null],记录[log_id = 2,log_type = delete,log_action = null],记录[log_id = 3,log_type = delete,log_action = null],记录[log_id = 4,log_type = delete,log_action = null],记录[log_id = 5,log_type = delete,log_action = null],记录[log_id = 6,log_type = delete,log_action = null],记录[log_id = 8, log_type = delete,log_action = null]]

老实说,可能有大量数据会导致性能问题,但我也不确定XD。但最后是一个解决方案。如果对你有帮助,别忘了给我答案。

答案 1 :(得分:0)

为了正确运行CONVERT函数,请使用以下代码:

Expression<String> convertFunction = cb.function("CONVERT", String.class, log_action, cb.function("CHAR", Object.class, cb.literal(100)));