我正在尝试将以下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();
任何想法我做错了什么?
谢谢,
肖恩
答案 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)));