Java JPA标准API函数转换或强制转换
我正在尝试将以下SQL转换为CriteriaBuilder代码 SQL: log_动作定义为varbinary(32) 代码:Java JPA标准API函数转换或强制转换,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我正在尝试将以下SQL转换为CriteriaBuilder代码 SQL: log_动作定义为varbinary(32) 代码: CriteriaBuilder cb=em.getCriteriaBuilder(); CriteriaQuery=cb.createQuery(Logging.class); Root-from=query.from(Logging.class); 表达式路径=from.get(“logAction”); 表达式convertFunction=cb.function(
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Logging.class);
Root-from=query.from(Logging.class);
表达式路径=from.get(“logAction”);
表达式convertFunction=cb.function(“CONVERT”,String.class,path);
查询。选择(从中);
谓词=cb.equal(convertFunction,“delete”);
where(谓词);
返回em.createQuery(query.getResultList();
知道我做错了什么吗
谢谢
肖恩在尝试了很多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);
private静态最终字符串PG_TRANSLATE_TO=“char(100)”;
ParameterExpression p=cb.parameter(String.class,“param0”);
表达式convertFunction=cb.function(“CONVERT”,String.class,from.get(“log_action”),p);
始终连接字符(100),但使用引号“char(100)”,则会出现SQL错误
错误代码:1064。您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“char(100)”附近使用的正确语法=“delete”
所以我决定直接对字节进行条件查询,因为它们在开头是字符串。
并使用以下代码
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());
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Logging.class);
ParameterExpression p=cb.parameter(String.class,“param0”);
Root-from=query.from(Logging.class);
查询。选择(从中);
where(cb.equal(from.get(“log_action”),“delete.getBytes());
System.out.println(em.createQuery(query.getResultList());
这确实有效
休眠:从logging0中选择logging0.log\u id作为log1\u 3\u,logging0.log\u操作作为log2\u 3\u,logging0.log\u类型作为log3\u 3\u,其中logging0.log\u操作=
[日志记录[日志id=1,日志类型=delete,日志操作=null],日志记录[日志id=2,日志类型=delete,日志操作=null],日志记录[日志id=3,日志类型=delete,日志操作=null],日志记录[日志id=4,日志类型=delete,日志操作=null],日志记录[日志id=5,日志类型=delete,日志操作=null],日志记录[日志id=6,日志类型=delete,日志操作=null],日志记录][log\u id=8,log\u type=delete,log\u action=null]]
老实说,对于大量的数据,您可能会遇到性能问题,但我也不确定XD。但最后是一个解决方案。如果我的答案对您有帮助,请不要忘记给我一个类似的答案。在尝试了很多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);
private静态最终字符串PG_TRANSLATE_TO=“char(100)”;
ParameterExpression p=cb.parameter(String.class,“param0”);
表达式convertFunction=cb.function(“CONVERT”,String.class,from.get(“log_action”),p);
始终连接字符(100),但使用引号“char(100)”,则会出现SQL错误
错误代码:1064。您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在第1行的“char(100)”=“delete”附近使用的正确语法
所以我决定直接对字节进行条件查询,因为它们在开头是字符串。
并使用以下代码
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());
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Logging.class);
ParameterExpression p=cb.parameter(String.class,“param0”);
Root-from=query.from(Logging.class);
查询。选择(从中);
where(cb.equal(from.get(“log_action”),“delete.getBytes());
System.out.println(em.createQuery(query.getResultList());
这确实有效
休眠:从logging0中选择logging0.log\u id作为log1\u 3\u,logging0.log\u操作作为log2\u 3\u,logging0.log\u类型作为log3\u 3\u,其中logging0.log\u操作=
[日志记录[日志id=1,日志类型=delete,日志操作=null],日志记录[日志id=2,日志类型=delete,日志操作=null],日志记录[日志id=3,日志类型=delete,日志操作=null],日志记录[日志id=4,日志类型=delete,日志操作=null],日志记录[日志id=5,日志类型=delete,日志操作=null],日志记录[日志id=6,日志类型=delete,日志操作=null],日志记录][log\u id=8,log\u type=delete,log\u action=null]]
老实说,对于大量的数据,您可能会遇到性能问题,但我也不确定XD。但最后是一个解决方案。如果我的答案对您有帮助,请不要忘记给我一个类似的答案。在尝试了很多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);
private静态最终字符串PG_TRANSLATE_TO=“char(100)”;
ParameterExpression p=cb.parameter(String.class,“param0”);
表达式convertFunction=cb.function(“CONVERT”,String.class,from.get(“log_action”),p);
始终连接字符(100),但使用引号“char(100)”,则会出现SQL错误
错误代码:1064。您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在第1行的“char(100)”=“delete”附近使用的正确语法
所以我决定直接对字节进行条件查询,因为它们在开头是字符串。
并使用以下代码
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());
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Logging.class);
ParameterExpression p=cb.parameter(String.class,“param0”);
Root-from=query.from(Logging.class);
查询。选择(从中);
where(cb.equal(from.get(“log_action”),“delete.getBytes());
System.out.println(em.createQuery(query.getResultList());
这确实有效
休眠:从logging0中选择logging0.log\u id作为log1\u 3\u,logging0.log\u操作作为log2\u 3\u,logging0.log\u类型作为log3\u 3\u,其中logging0.log\u操作=
[日志记录[log\u id=1,log\u type=delete,log\u action=null],日志记录[log\u id=2,log\u type=delete,log\u action=null],日志记录[log\u id=3,log\u type=delete,log\u action=null],Lo