1. 程式人生 > >讓hql支援按位與運算

讓hql支援按位與運算

摘要: 目前hibernate不支援按位與運算,近期的專案又需要這樣的操作,好在hibernate提供了相關的擴充套件功能,能自己實現相關的操作

一、背景

工作中,使用的資料庫為MySQL,專案使用的語言為java,採用了JPA技術,底層用的是hibernate,專案中有些需要進行按位與運算,但是hql語言確不支援,該文章描述瞭如何讓我們的程式支援按位與的操作

二、實現

首選實現SQLFunction介面

package com.XXXX.hql;
import java.util.List;
import org.hibernate.QueryException;
import org.hibernate.dialect.function.SQLFunction;
import
org.hibernate.engine.spi.Mapping; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.type.Type; public class BitAndFunction implements SQLFunction { @Override public boolean hasArguments() { return true; } @Override public boolean hasParenthesesIfNoArguments
() { return true; } @Override public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException { return org.hibernate.type.IntegerType.INSTANCE; } @Override public String render(Type firstArgumentType, List arguments,SessionFactoryImplementor factory) throws
QueryException { if(arguments.size() != 2){ throw new IllegalArgumentException("BitAndFunction requires 2 arguments!"); } return arguments.get(0).toString() + " & " + arguments.get(1).toString(); } }

然後擴充套件原有的方言,將自己擴充套件的功能註冊到hibernate中

package com.XXX.hql;
public class CustomSQLDialect extends org.hibernate.dialect.MySQL5InnoDBDialect {
 public CustomSQLDialect() {
     super();
     this.registerFunction("bitand", new BitAndFunction());
 }
}

最後配置方言是配置上該類

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="com.XXX.hql.CustomSQLDialect"/>
           <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
            <property name="hibernate.connection.charSet" value="UTF-8"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

在hql語言中使用方式如下:

from TableEntity where bitand(fieldname,1) =0

bitand就是自己實現的按位與的方法

三、總結

hibernate提供的擴充套件功能還是相當靈活的,當資料庫的一個特性不能充分發揮時,可以自己擴充套件hibernate的功能來達到相應的目的