讓hql支援按位與運算
阿新 • • 發佈:2019-01-09
摘要: 目前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的功能來達到相應的目的