日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java hql多条件查询_Hibernate结合JPA编写通用泛型多条件查询

發布時間:2024/10/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java hql多条件查询_Hibernate结合JPA编写通用泛型多条件查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目中使用Hibernate和JPA對數據庫對象進行實例化,但是生成的方法不支持多條件查詢。而如果針對每一個數據庫對象進行多條件查詢編碼,則會變得很麻煩,而且一旦以后發生表結構發生變化,這些方法可能還需要進行重新編碼。所以考慮編寫一個方法可以對數據庫對象進行多條件查詢,并返回泛型對象,這樣就可以方便使用。具體實現思路如下:

第一步:編寫數據庫查詢參數對象,此部分包含兩個,一個是查詢實體名稱(QueryCondition.java),一個是數據庫查詢條件對象(QueryParameter.java)。

數據庫查詢條件對象(QueryParameter.java)包含三個參數,分別為參數名、參數值、查詢條件表達式

package?com.imstudio.jpa;

public?class?QueryParameter?{

public?enum?QueryOperateType?{

Equal,?CharIn

}

public?String?ParameterName;

public?Object?ParameterValue;

public?QueryOperateType?ParameterType;

public?QueryParameter()?{

}

public?QueryParameter(String?parameterName,?Object?parameterValue,

QueryOperateType?parameterType)?{

this.ParameterName?=?parameterName;

this.ParameterValue?=?parameterValue;

this.ParameterType?=?parameterType;

}

public?String?getParameterName()?{

return?ParameterName;

}

public?QueryOperateType?getParameterType()?{

return?ParameterType;

}

public?Object?getParameterValue()?{

return?ParameterValue;

}

public?void?setParameterName(String?parameterName)?{

ParameterName?=?parameterName;

}

public?void?setParameterType(QueryOperateType?parameterType)?{

this.ParameterType?=?parameterType;

}

public?void?setParameterValue(Object?parameterValue)?{

ParameterValue?=?parameterValue;

}

}

查詢對象實體(QueryCondition.java)包含查詢實體名稱以及查詢參數對象

package?com.imstudio.jpa;

import?java.util.ArrayList;

import?java.util.List;

public?class?QueryCondition?{

public?String?ModelName;

public?List?Parameters?=?new?ArrayList();

public?QueryCondition()?{

}

public?QueryCondition(String?modelName)?{

this.ModelName?=?modelName;

}

public?QueryCondition(String?modelName,?List?parameters)?{

this.ModelName?=?modelName;

this.Parameters?=?parameters;

}

public?void?add(QueryParameter?queryParameter)?{

this.Parameters.add(queryParameter);

}

public?String?getModelName()?{

return?ModelName;

}

public?List?getParameters()?{

return?Parameters;

}

public?void?setModelName(String?modelName)?{

ModelName?=?modelName;

}

public?void?setParameters(List?parameters)?{

Parameters?=?parameters;

}

}

在完成上述兩個實體對象之后就可以具體查詢方法的編寫了,在查詢中使用到一個變量querySymbols,下述編碼是從配置文件web.xml中獲取,這里主要是為了在使用不同數據庫的時候查詢關鍵字標示符的修改。同時為了增加查詢方法的通用性,查詢返回數據這里定義為泛型。

package?com.imstudio.jpa;import?java.util.ArrayList;

import?java.util.List;

import?java.util.logging.Level;

import?javax.persistence.EntityManager;

import?javax.persistence.Query;

import?org.apache.struts2.ServletActionContext;

import?com.imstudio.jpa.QueryParameter.QueryOperateType;

public?class?QueryDataAction?{

public?String?errorCode;

public?QueryDataAction()?{

}

public?QueryDataAction(String?errorCode)?{

this.errorCode?=?errorCode;

}

public?String?getErrorCode()?{

return?errorCode;

};

@SuppressWarnings("unchecked")

public??List?queryByPropertys(QueryCondition?queryCondition)?{

String?querySymbols?=?ServletActionContext.getServletContext()

.getInitParameter("QuerySymbols");

StringBuffer?sqlBuffer?=?new?StringBuffer();

sqlBuffer.append("select?model?\n");

sqlBuffer.append("from?"?+?queryCondition.ModelName?+?"?as?model?\n");

boolean?first?=?true;

for?(int?pi?=?0;?pi?

if?(queryCondition.Parameters.get(pi).getParameterName()?!=?null)?{????????????????????????????????if?(first)?{

sqlBuffer.append("where?");

first?=?false;

}?else?{

sqlBuffer.append("and?");

}

if?(queryCondition.Parameters.get(pi).getParameterType()?==?QueryOperateType.Equal)?{

sqlBuffer.append("model."

+?queryCondition.Parameters.get(pi)

.getParameterName()????????????????????????????+?"?=?"

+?querySymbols????????????????????????????+?queryCondition.Parameters.get(pi)

.getParameterName()?+?"?\n");

}?else?if?(queryCondition.Parameters.get(pi).getParameterType()?==?QueryOperateType.CharIn)?{

sqlBuffer.append("InStr(model."

+?queryCondition.Parameters.get(pi)

.getParameterName()????????????????????????????+?"?,?"

+?querySymbols????????????????????????????+?queryCondition.Parameters.get(pi)

.getParameterName()?+?"?)?>?0?\n");

}

}

}

List?list?=?new?ArrayList();

try?{

EntityManagerHelper.log(sqlBuffer.toString(),?Level.INFO,?null);

EntityManager?emEntityManager?=?EntityManagerHelper

.getEntityManager();

Query?queryObject?=?emEntityManager.createQuery(sqlBuffer

.toString());

for?(int?li?=?0;?li?

queryObject.setParameter(queryCondition.Parameters.get(li)

.getParameterName(),?queryCondition.Parameters.get(li)

.getParameterValue());

}

list?=?queryObject.getResultList();

emEntityManager.close();

}?catch?(RuntimeException?re)?{

errorCode?+=?"CM000006";

EntityManagerHelper.log("queryByPropertys?error",?Level.SEVERE,?re);

throw?re;

}????????return?list;

}

public?void?setErrorCode(String?errorCode)?{

this.errorCode?=?errorCode;

}

}

總結

以上是生活随笔為你收集整理的java hql多条件查询_Hibernate结合JPA编写通用泛型多条件查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。