Как стать автором
Обновить

Hibernate и битовые операции

Время на прочтение2 мин
Количество просмотров1K
Как оказалось Hibernate не приемлит битовых операций в условиях hql запроса. Например, «from Events where type & mask <> 0» генерирует исключение парсера, так же битовых операций нет в документации. Однако не стоит отчаиваться.


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 запрос будет выглядеть как надо.
Теги:
Хабы:
+1
Комментарии2

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн