1. 程式人生 > >解決Hibernate 3不支援 "&" 運算的SQL語句

解決Hibernate 3不支援 "&" 運算的SQL語句

按位與運算(&)在許多資料庫中都是支援的,遺憾的是,Hibernate 3在HQL中不支援&運算,如果你寫了如下的HQL:

where a.id & :mask = :target

則Hibernate報錯:exception: unexpected char: '&'.

如何解決此問題?方法是利用Hibernate支援的自定義SQLFunction,定義一個bitand(a,b)的SQLFunction,然後,自己寫一個直譯器,生成a & b的SQL語句。

要實現一個自定義的SQLFunction,必須實現SQLFunction介面:

package com.js.dialect;

import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.QueryException;
import org.hibernate.dialect.function.SQLFunction;
import org.hibernate.engine.Mapping;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.type.Type;

/**
 * <p>
 * Title:BitAndFunction
 * </p>
 * <p>
 * Description:
 * </p>
 *
 * @author js
 * @version
 * @since
 */

public class BitAndFunction implements SQLFunction {
 public Type getReturnType(Type type, Mapping mapping) {
  return Hibernate.INTEGER;
 }

 public boolean hasArguments() {
  return true;
 }

 public boolean hasParenthesesIfNoArguments() {
  return true;
 }

 public String render(List args, SessionFactoryImplementor factory)
   throws QueryException {
  if (args.size() != 2) {
   throw new IllegalArgumentException(
     "BitAndFunction requires 2 arguments!");
  }
  return args.get(0).toString() + " & " + args.get(1).toString();
 }

}

然後,根據使用的資料庫方言,派生一個自定義的CustomSQLDialect:

 package com.js.dialect;

import org.hibernate.dialect.MySQLInnoDBDialect;

/**
 * <p>
 * Title:CustomSQLDialect
 * </p>
 * <p>
 * Description:
 * </p>
 *
 * @author js
 * @version
 * @since
 */
public class CustomSQLDialect extends MySQLInnoDBDialect {
 /**
  *
  */
 public CustomSQLDialect() {
  super();
  registerFunction("bitand", new BitAndFunction());
 }

}

設定函式名為bitand,引數和返回值均為Hibernate.LONG,現在,用CustomSQLDialect替換配置檔案中的設定,然後修改HQL:

where bitand(a.id, :mask) = :target

編譯,執行,觀察Hibernate的SQL輸出,執行不成功!不認識"bitand"!

相關推薦

解決Hibernate 3支援 "&" 運算SQL語句

按位與運算(&)在許多資料庫中都是支援的,遺憾的是,Hibernate 3在HQL中不支援&運算,如果你寫了如下的HQL: where a.id & :mask = :target 則Hibernate報錯:exception: unexpected

Hive2.3.3 等於運算解決方案

Hive都2.0時代了,但好像在聯表查詢時對!=或者<>支援的不是很好。 昨天進行聯表查詢時,利用兩個表的userid進行等值關聯,查詢結果正確,hql如下: select t1.* fr

HTML2PDF V4.0.3支援中文的解決辦法

1.V4是基於TCPDF的,增加中文字型http://www.yinzhili.com/2009/08/using-tcpdf- to-generate-pdf-in-chinese.html(好像要翻)。為了方便,我貼上在此後面,謝謝yinzhili.com。 2.增加好

c#“對於返回任何基表資訊的 SelectCommand 支援動態 SQL 生成”錯誤的解決

 昨天在做C#一個小程式的時候也遇到了“對於不返回任何基表資訊的 SelectCommand 不支援動態 SQL 生成”的錯誤提示。經過GOOGLE上的搜尋,絕大多數的帖子都指出是由於表沒有定義主鍵引起的,但是我的表的確是有主鍵定義了的,在程式碼中關聯了主鍵也不行。最後終於解

hibernate框架中配置顯示sql語句

per 控制 col property hiberna color sql 輸出 最好 使用Hibernate的框架開發時,可在Hibernate.cfg.xml中加上 <property name="hibernate.show_sql">true<

解決oracle數據庫刪除sql語句出現^H字樣

fig alias bsp readline plus rlwrap p s sta .gz 1:安裝readline包 yum install readline* 2:安裝源碼包: rlwrap-0.30.tar.gz ./configure &&

解決Mybatis Generator生成動態查詢語句問題

動態查詢語句即可以在查詢的時候根據傳入的引數是否非空,動態生成查詢語句。 有的時候用Mybatis Generator不能生成sample語句。 下面兩個操作都是針對generatorConfig.xml檔案進行修正 1.設定targetRuntime=MyBatis3。如果targetRun

iOS 開發: 解決Xcode7.3 能自動索引標頭檔案,檔名等問題

iOS 開發: 解決Xcode7.3 不能自動索引標頭檔案,檔名,程式碼補全等問題 解決方案: 開啟Xcode –> Target –> BuildSettings –> Apple LLVM 7.1 -Language-Objective C 下面的 Weak

android studio 升級到2.3 支援apt

android studio 升級到2.3以後提示: Warning:Using incompatible plugins for the annotation processing: android-apt. This may result in an unexpected beha

idea中java: -source 1.5 中支援 multi-catch語句支援 lambda 表示式

一、在idea中出現如下錯誤 Error:(27, 35) java: -source 1.5 中不支援 multi-catch 語句 (請使用 -source 7 或更高版本以啟用 multi-catch 語句) 解決辦法: 在idea中重新設定 File ->Proj

解決IE8下支援border-radius的問題

最近做了一個專案,是讓相容IE8瀏覽器的,遇到了IE8不支援border-radius和box-shadow的問題,在網上找了解決方案,主要是藉助於PIE.htc,具體的過程,發一個寫的比較好的文章(看連線文章之後,如果您還沒有解決問題,建議回過頭來看看我下面的注意事項,否則

Thinkphp3.2.3:執行原生SQL語句

【查詢語句】query方法 示例:查詢blog_article表中的文章標題title欄位 //構造sql語句 $sql = "select `title` from blog_article";

解決瀏覽器(IE)支援Data.parse()的問題

 IE或其他不能識別JS函式Date.parse的解決方法  ,當我們用JS計算兩個時間的間隔時,我們會用到Date.parse 這個JS函式。 var begintime = "2012-12-22";  //開始時間 var endtime = "2012-12

解決老瀏覽器支援ES6的方法

轉載地址:http://www.rockyxia.com/?p=669 為什麼ES6會有相容性問題? 由於廣大使用者使用的瀏覽器版本在釋出的時候也許早於ES6的定稿和釋出,而到了今天,我們在程式設計中如果使用了ES6的新特性,瀏覽器若沒有更新版本,或者新版本中沒有對ES6的

Spring 整合mybatis 3.幾之後,列印sql語句到控制檯

      搜尋了對應的關鍵字,有很多部落格,說要配置log4j,但試了一下都沒有用,後來找到一篇部落格:http://blog.csdn.net/wang_tao219/article/details/52901279,其實很簡單,只需要在mybatis的配置檔案中加入如

關於hibernate HQL能使用insert語句

使用HQL語句來完成插入操作是不能實現的,不管你使用insert into....values...還是insert into.....select.....都不行 原因:因為Hibernate的HQL語言是用於面向物件實現查詢功能的,然而在插入操作中是不會牽涉任何查詢動作

C#中"對於多個基表支援動態SQL生成"的錯誤原因

public int CreateCmdsAndUpdate(DataGridView dgv) { using (OleDbConnection connection = new OleDbConnection(db

微信小程式解決富文字支援的問題

使用wxParse來解決目錄下的wxParse資料夾,把他拷貝到我們的專案目錄下假如a頁面需要顯示富文字資訊:引入後,在要使用的頁面 a.wxml檔案裡引入 <import src="../../wxParse/wxParse.wxml"/> //你的路徑地址  

Mybatis傳多個參數(三種解決方案) mapper.xml的sql語句修改!

修改 and 接收 select sql 函數 resultmap rom var 第一種 Public User selectUser(String name,String area); 對應的Mapper.xml <select id="selectUs

[hibernate]log4jdbc日誌輸出完整SQL語句

att 完整 sql 連接 end 需要 result mysq num 1.在maven引入: <dependency> <groupId>log4j</group