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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

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

項(xiàng)目中使用Hibernate和JPA對(duì)數(shù)據(jù)庫(kù)對(duì)象進(jìn)行實(shí)例化,但是生成的方法不支持多條件查詢。而如果針對(duì)每一個(gè)數(shù)據(jù)庫(kù)對(duì)象進(jìn)行多條件查詢編碼,則會(huì)變得很麻煩,而且一旦以后發(fā)生表結(jié)構(gòu)發(fā)生變化,這些方法可能還需要進(jìn)行重新編碼。所以考慮編寫(xiě)一個(gè)方法可以對(duì)數(shù)據(jù)庫(kù)對(duì)象進(jìn)行多條件查詢,并返回泛型對(duì)象,這樣就可以方便使用。具體實(shí)現(xiàn)思路如下:

第一步:編寫(xiě)數(shù)據(jù)庫(kù)查詢參數(shù)對(duì)象,此部分包含兩個(gè),一個(gè)是查詢實(shí)體名稱(chēng)(QueryCondition.java),一個(gè)是數(shù)據(jù)庫(kù)查詢條件對(duì)象(QueryParameter.java)。

數(shù)據(jù)庫(kù)查詢條件對(duì)象(QueryParameter.java)包含三個(gè)參數(shù),分別為參數(shù)名、參數(shù)值、查詢條件表達(dá)式

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;

}

}

查詢對(duì)象實(shí)體(QueryCondition.java)包含查詢實(shí)體名稱(chēng)以及查詢參數(shù)對(duì)象

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;

}

}

在完成上述兩個(gè)實(shí)體對(duì)象之后就可以具體查詢方法的編寫(xiě)了,在查詢中使用到一個(gè)變量querySymbols,下述編碼是從配置文件web.xml中獲取,這里主要是為了在使用不同數(shù)據(jù)庫(kù)的時(shí)候查詢關(guān)鍵字標(biāo)示符的修改。同時(shí)為了增加查詢方法的通用性,查詢返回?cái)?shù)據(jù)這里定義為泛型。

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;

}

}

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。