Как оказалось Hibernate не приемлит битовых операций в условиях hql запроса. Например, «from Events where type & mask <> 0» генерирует исключение парсера, так же битовых операций нет в документации. Однако не стоит отчаиваться.
Далле необходимо создать диалект, пронаследовав от текущего:
К сожалению использовать
- Во-первых, сравнение с маской можно заменить, пойдя математическим путём.
field & mask != 0
эквивалентно(field / mask) % 2 = 1
- Во-вторых, реализовать свою SQL функцию и зарегистрировать её в диалекте.
public class BitwiseAndFunction extends StandardSQLFunction
implements SQLFunction {
public BitwiseAndFunction(String name) {
super(name);
}
public BitwiseAndFunction(String name, Type type) {
super(name, type);
}
public String render(List args, SessionFactoryImplementor factory)
throws QueryException {
if (args.size() != 2) {
throw new IllegalArgumentException("the function must be passed 2 arguments");
}
StringBuffer buffer = new StringBuffer(args.get(0).toString());
buffer.append(" & ").append(args.get(1));
return buffer.toString();
}
}
* This source code was highlighted with Source Code Highlighter.
Далле необходимо создать диалект, пронаследовав от текущего:
public class MySQLDialectFixed extends MySQL5Dialect {
public MySQLDialectFixed() {
super();
registerFunction("bitwise_and", new BitwiseAndFunction("bitwise_and", Hibernate.INTEGER));
}
}
* This source code was highlighted with Source Code Highlighter.
К сожалению использовать
type & mask <> 0
всё равно не выйдет, только bitwise_and(type, mask) <> 0
. Однако SQL запрос будет выглядеть как надо.