Используя критерии 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();
Результирующий запрос sql выдает что-то вроде:
select ...snip aliases... from SourcePath where cast(x'00010002', char(1)) = path;
(путь будет каким-то неприятным старым псевдоним, но это не имеет значения).
Этот запрос неверен. В частности, приведение: cast(x'00010002', char(1))
не является приведением к как строке, как указано в .as(String.class)
, вместо этого оно должно быть либо cast(x'00010002', char)
, либо cast(x'00010002', char(N)
, где N
- достаточно большое число.
Я изолировал причину сбоя приведения к MySqlDialect, предоставленному org.hibernate. В частности:
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)" );
.
.as
, которая будет правильно разыгрываться? Или я должен использовать строки везде, где я сейчас использую шестнадцатеричные значения, чтобы не касаться крайних случаев реализации hibernate?
Спасибо idb