Pull to refresh

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

Reading time2 min
Views1.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 запрос будет выглядеть как надо.
Tags:
Hubs:
Total votes 7: ↑4 and ↓3+1
Comments3

Articles