Mysql JPA2标准API.as(String.class)转换为char(1)-如何解决这个问题?

Mysql JPA2标准API.as(String.class)转换为char(1)-如何解决这个问题?,mysql,hibernate,casting,jpa-2.0,criteria-api,Mysql,Hibernate,Casting,Jpa 2.0,Criteria Api,使用criteria api,我有一个查询,它执行以下操作: CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<SourcePath> pathQuery = cb.createQuery(SourcePath.class); Root<SourcePath> pathRoot = pathQuery.from(SourcePath.class); pathQuery.where(

使用criteria 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();
select ...snip aliases... from SourcePath where cast(x'00010002', char(1)) = path;
(path可能是一个讨厌的老别名,但这并不重要)

此查询不正确。特别是,强制转换:
cast(x'00010002',char(1))
不是由
.as(string.class)
指定的强制转换为字符串,而是应该是
cast(x'00010002',char)
cast(x'000120002',char(N)
其中
N
是一个足够大的数字

我已经从org.hibernate提供的mysqldialent中找出了这个cast失败的原因。特别是:

public String getCastTypeName(int code) {
    if ( code==Types.INTEGER ) {
       return "signed";
    }
     else if ( code==Types.VARCHAR ) {
        return "char";
    }
    ...snip...
}
在链的更深处,它被解释为
char
,由对话框注册:
registerColumnType(Types.char,“char(1)”;

最后是我的问题。我如何解决这个问题?我是否将它作为一个bug报告给Hibernate?我是否扩展对话框并更正从getCastTypeName返回的类型?是否有一种替代方法可以适当地强制转换
。as
?或者,我是否应该在当前使用十六进制值的任何地方使用字符串以避免接触边缘hibernate实现的案例

谢谢
idb

IMHO,您应该使用类似于
cb.literal(“\u0001\u0002”)
的字符串文字。原因:

  • 它与
    cb.literal(0x00010002).as(String.class)
    相同,但不太详细
  • 没有击中任何“边缘案例”
  • 更清楚的是:“0x00010002”是用Big-Endian还是LE处理的?应该使用哪种编码
  • 您可以使用常量(例如:
    cb.literal(ASCII\u-SOH+ASCII\u-STX)
    其中SOH=“\u0001”和STX=“\u0002”)提高易读性

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

    扩展方言似乎是最简单的方法。或者,修复方言,在hibernate JIRA上提出问题并提交解决方案。扩展方言,或者在任何地方使用字符串,直到错误被修复。提出JIRA。我在问题中提到了这一点:“或者,我应该在当前使用十六进制值的地方使用字符串来避免…”.这当然是一个选择。对此我很抱歉。我现在把我的“意见”说得更正式了