idb*_*ley 10 mysql hibernate casting criteria-api jpa-2.0
使用标准api,我有一个查询,它执行以下操作:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<SourcePath> pathQuery = cb.createQuery(SourcePath.class);
Root<SourcePath> pathRoot = pathQuery.from(SourcePath.class);
pathQuery.where(cb.equal(cb.literal(0x00010002).as(String.class), (pathRoot.get(SourcePath_.path))));
TypedQuery<SourcePath> query = entityManager.createQuery(pathQuery);
query.getResultList();
Run Code Online (Sandbox Code Playgroud)
生成的sql查询结果如下:
select ...snip aliases... from SourcePath where cast(x'00010002', char(1)) = path;
Run Code Online (Sandbox Code Playgroud)
(路径将是一些讨厌的旧别名,但这是无关紧要的).
此查询不正确.特别是,中投:cast(x'00010002', char(1))不强制转换为字符串,由指定的.as(String.class),相反,它应该是cast(x'00010002', char),或者cast(x'00010002', char(N)在那里N是一个合适的足够大的数量.
我已将此抛出失败的原因与org.hibernate提供的MySqlDialect隔离开来.尤其:
public String getCastTypeName(int code) {
if ( code==Types.INTEGER ) {
return "signed";
}
else if ( code==Types.VARCHAR ) {
return "char";
}
...snip...
}
Run Code Online (Sandbox Code Playgroud)
链的哪一个被解释为a char,由对话框注册:registerColumnType( Types.CHAR, "char(1)" );.
最后,对我的问题.我该如何解决这个问题?我是否将其报告为Hibernate的错误?我是否扩展了Dialog并从getCastTypeName更正了返回的类型?是否有.as适当的选择?或者,我应该在任何地方使用字符串我目前正在使用十六进制值,以避免触及hibernate实现的边缘情况?
谢谢你
恕我直言,您应该使用像 这样的字符串文字cb.literal("\u0001\u0002")。理由:
cb.literal(0x00010002).as(String.class),但更简洁。cb.literal(ASCII_SOH + ASCII_STX)其中 SOH="\u0001" 和 STX="\u0002")。编辑:添加更好的描述,因为我没有看到“或者,我应该在当前使用十六进制值的任何地方使用字符串”
| 归档时间: |
|
| 查看次数: |
1297 次 |
| 最近记录: |