JPA2 Criteria API .as(String.class)转换为char(1) - 我该如何解决这个问题?

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实现的边缘情况?

谢谢你

Edu*_*sta 1

恕我直言,您应该使用像 这样的字符串文字cb.literal("\u0001\u0002")。理由:

  1. 它与 相同cb.literal(0x00010002).as(String.class),但更简洁。
  2. 不会遇到任何“边缘情况”
  3. 更清楚的是:“0x00010002”是在 Big Endian 还是 LE 中处理的?应该使用哪种编码?
  4. 您可以使用常量提高易读性(例如:cb.literal(ASCII_SOH + ASCII_STX)其中 SOH="\u0001" 和 STX="\u0002")。

编辑:添加更好的描述,因为我没有看到“或者,我应该在当前使用十六进制值的任何地方使用字符串”