Java 如何通过Criteria Builder使用多个根执行选择查询
我对使用criteria builder非常陌生,所以这是我第一次尝试。我尝试使用多个实体类,所以我使用多个根来比较这些东西。我觉得我在第一个方法末尾的select语句是错误的,因为我没有将这两个根都合并到它中。特别是因为我使用sl和sld来比较谓词where子句中的内容。我需要加入他们吗?我将来如何添加更多的类?如果我想从每个表中选择特定的内容以返回到自定义对象中,是否必须更改select语句?谢谢 拉式选择语句:Java 如何通过Criteria Builder使用多个根执行选择查询,java,sql,hibernate,predicate,criteria-api,Java,Sql,Hibernate,Predicate,Criteria Api,我对使用criteria builder非常陌生,所以这是我第一次尝试。我尝试使用多个实体类,所以我使用多个根来比较这些东西。我觉得我在第一个方法末尾的select语句是错误的,因为我没有将这两个根都合并到它中。特别是因为我使用sl和sld来比较谓词where子句中的内容。我需要加入他们吗?我将来如何添加更多的类?如果我想从每个表中选择特定的内容以返回到自定义对象中,是否必须更改select语句?谢谢 拉式选择语句: cq.select(sl); cq.where(predicates.toAr
cq.select(sl);
cq.where(predicates.toArray(new Predicate[] {}));
全班:
@Repository
public class DealerTotalsQueryRepository {
private static final String START_DATE = "0001-01-01";
private static final String TERMINATION_DATE = "terminationDate";
private static final String KEY = "key";
private static final String DEALER_CODE = "dealerCode";
private static final String SERVICE_LETTER_NUMBER = "serviceLetterNumber";
private static final String OPEN_COMPLETE_IND_O = "O";
private static final String OPEN_COMPLETE_IND_C = "C";
private static final String COMPLETION_DATE = "completionDate";
private static final String TERM_IND_NTERM = "nterm";
private static final String TERM_IND_TERM = "term";
private static final String SERVICE_LETTER_DATE = "serviceLetterDate";
@PersistenceContext
private EntityManager em;
public List < ServiceLetter > findAllServiceLetters(Map < String, String > searchCriteriaData) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery < ServiceLetter > cq = cb.createQuery(ServiceLetter.class);
Root < ServiceLetter > sl = cq.from(ServiceLetter.class);
Root < ServiceLetterDesc > sld = cq.from(ServiceLetterDesc.class);
List < Predicate > predicates = new ArrayList < > ();
String marketOrg = searchCriteriaData.get(GlobalConstants.MARKET_ORG);
String dealerCd = searchCriteriaData.get(GlobalConstants.DEALER_CD);
String programNo = searchCriteriaData.get(GlobalConstants.PROGRAM_NO);
String openCompleteInd = searchCriteriaData.get(GlobalConstants.OPEN_COMPLETE_IND);
String termInd = searchCriteriaData.get(GlobalConstants.TERM_IND);
String dateFrom = searchCriteriaData.get(GlobalConstants.DATE_FROM);
String dateTo = searchCriteriaData.get(GlobalConstants.DATE_TO);
String pinPrefix = searchCriteriaData.get(GlobalConstants.SERIAL_NO_PREFIX);
String letterType = searchCriteriaData.get(GlobalConstants.LETTER_TYPE);
java.sql.Date currentDate = new java.sql.Date(System.currentTimeMillis());
if (marketOrg != null && !marketOrg.isEmpty()) {
//predicates.add(cb.equal(sl.get(""), ""));
}
if (dealerCd != null && !dealerCd.isEmpty()) {
predicates.add(cb.equal(sl.get(KEY).get(DEALER_CODE), dealerCd));
}
if (programNo != null && !programNo.isEmpty()) {
predicates.add(cb.equal(sl.get(KEY).get(SERVICE_LETTER_NUMBER), programNo));
} else {
predicates.add(pipPspIndCodeClause(cb, sld, letterType));
}
if (openCompleteInd != null && !openCompleteInd.equalsIgnoreCase("all")) {
if (openCompleteInd.equalsIgnoreCase(OPEN_COMPLETE_IND_O)) {
predicates.add(cb.equal(sl.get(COMPLETION_DATE), START_DATE));
} else if (openCompleteInd.equalsIgnoreCase(OPEN_COMPLETE_IND_C)) {
predicates.add(cb.notEqual(sl.get(COMPLETION_DATE), START_DATE));
}
}
if (termInd != null && !termInd.equalsIgnoreCase("all")) {
if (termInd.equalsIgnoreCase(TERM_IND_NTERM)) {
Predicate termEToStart = cb.equal(sld.get(TERMINATION_DATE), START_DATE);
Predicate termGTCurrentDate = cb.greaterThan(sld.get(TERMINATION_DATE), currentDate);
predicates.add(cb.or(termEToStart, termGTCurrentDate));
} else if (termInd.equalsIgnoreCase(TERM_IND_TERM)) {
Predicate termGTStartDate = cb.greaterThan(sld.get(TERMINATION_DATE), START_DATE);
Predicate termLTOETCurrentDate = cb.lessThanOrEqualTo(sld.get(TERMINATION_DATE), currentDate);
predicates.add(cb.and(termGTStartDate, termLTOETCurrentDate));
}
}
if (dateFrom != null && !dateFrom.isEmpty()) {
predicates.add(cb.between(sld.get(SERVICE_LETTER_DATE), dateFrom, dateTo));
}
if (pinPrefix != null && pinPrefix.isEmpty()) {
/* buff.append("AND A.SER_NO_PFX IN (" + setupWhereIn(pv, parms.get(ChooseQuery.PIN_PREFIX_KEY), true, 3) + ") "); */
}
cq.select(sl);
cq.where(predicates.toArray(new Predicate[] {}));
TypedQuery < ServiceLetter > q = em.createQuery(cq);
return q.getResultList();
}
private Predicate pipPspIndCodeClause(CriteriaBuilder cb, Root < ServiceLetterDesc > sld, String letterType) {
Predicate pipPspIndCode = null;
Predicate predTemp1 = null;
Predicate predTemp2 = null;
Predicate predTemp3 = null;
Predicate predTemp4 = null;
List < String > serviceLetterNumberList = Arrays.asList(new String[] {
"956151",
"956170"
});
Expression < String > serviceLetterNumberExpression = sld.get(SERVICE_LETTER_NUMBER);
if (letterType != null && !letterType.equalsIgnoreCase("all")) {
switch (letterType) {
case "pip":
pipPspIndCode = cb.like(sld.get(SERVICE_LETTER_NUMBER), "94%");
break;
case "pipsaf":
predTemp1 = cb.like(sld.get(SERVICE_LETTER_NUMBER), "940%");
predTemp2 = cb.like(sld.get(SERVICE_LETTER_NUMBER), "941%");
pipPspIndCode = cb.or(predTemp1, predTemp2);
break;
case "pippri":
pipPspIndCode = cb.like(sld.get(SERVICE_LETTER_NUMBER), "943%");
break;
case "psp":
pipPspIndCode = cb.like(sld.get(SERVICE_LETTER_NUMBER), "95%");
break;
case "pspbaf":
predTemp1 = cb.like(sld.get(SERVICE_LETTER_NUMBER), "954%");
predTemp2 = cb.like(sld.get(SERVICE_LETTER_NUMBER), "958%");
predTemp3 = cb.or(predTemp1, predTemp2);
predTemp4 = cb.between(sld.get(SERVICE_LETTER_NUMBER), "9590016", "9590109");
pipPspIndCode = cb.or(predTemp3, predTemp4);
break;
case "pspaf":
predTemp1 = cb.like(sld.get(SERVICE_LETTER_NUMBER), "955%");
predTemp2 = cb.between(sld.get(SERVICE_LETTER_NUMBER), "9560000", "9560027");
predTemp3 = cb.or(predTemp1, predTemp2);
predTemp4 = serviceLetterNumberExpression.in(serviceLetterNumberList);
pipPspIndCode = cb.or(predTemp3, predTemp4);
//predTemp4 = cb.in(sld.get(SERVICE_LETTER_NUMBER)).value(serviceLetterNumberList);
break;
case "pspcn9":
pipPspIndCode = cb.between(sld.get(SERVICE_LETTER_NUMBER), "9590110", "9599999");
break;
case "pspcn6":
predTemp1 = cb.between(sld.get(SERVICE_LETTER_NUMBER), "9590110", "9599999");
predTemp2 = serviceLetterNumberExpression.in(serviceLetterNumberList).not();
pipPspIndCode = cb.or(predTemp1, predTemp2);
break;
}
}
return pipPspIndCode;
}
}
@存储库
公共类DealTotalQueryRepository{
专用静态最终字符串开始\u DATE=“0001-01-01”;
私有静态最终字符串终止\u DATE=“terminationDate”;
私有静态最终字符串KEY=“KEY”;
私有静态最终字符串DEALER\u CODE=“dealerCode”;
专用静态最终字符串服务\u LETTER\u NUMBER=“serviceLetterNumber”;
私有静态最终字符串OPEN\u COMPLETE\u IND\u O=“O”;
私有静态最终字符串OPEN\u COMPLETE\u IND\u C=“C”;
私有静态最终字符串完成\u DATE=“completionDate”;
私有静态最终字符串项\u IND\u NTERM=“NTERM”;
私有静态最终字符串TERM\u IND\u TERM=“TERM”;
私有静态最终字符串服务\u LETTER\u DATE=“serviceLetterDate”;
@持久上下文
私人实体管理者;
公共列表findAllServiceLetters(映射searchCriteriaData){
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuerycq=cb.createQuery(ServiceLetter.class);
Rootsl=cq.from(ServiceLetter.class);
Rootsld=cq.from(ServiceLetterDesc.class);
Listpredicates=newarraylist<>();
字符串marketOrg=searchCriteriaData.get(GlobalConstants.MARKET_ORG);
String dealerCd=searchCriteriaData.get(GlobalConstants.DEALER\u CD);
String programNo=searchCriteriaData.get(GlobalConstants.PROGRAM_NO);
字符串openCompleteInd=searchCriteriaData.get(GlobalConstants.OPEN\u COMPLETE\u IND);
String termInd=searchCriteriaData.get(GlobalConstants.TERM\u IND);
String dateFrom=searchCriteriaData.get(GlobalConstants.DATE\u FROM);
String dateTo=searchCriteriaData.get(GlobalConstants.DATE\u TO);
String pinPrefix=searchCriteriaData.get(GlobalConstants.SERIAL\u NO\u前缀);
String letterType=searchCriteriaData.get(GlobalConstants.LETTER_-TYPE);
java.sql.Date currentDate=新的java.sql.Date(System.currentTimeMillis());
if(marketOrg!=null&&!marketOrg.isEmpty()){
//add(cb.equal(sl.get(“”“”));
}
if(dealerCd!=null&&!dealerCd.isEmpty()){
add(cb.equal(sl.get(KEY).get(DEALER_CODE),dealerCd));
}
if(programNo!=null&&!programNo.isEmpty()){
add(cb.equal(sl.get(KEY).get(SERVICE_字母_编号),programNo));
}否则{
add(pipppindcodeclause(cb,sld,letterType));
}
if(openCompleteInd!=null&!openCompleteInd.equalsIgnoreCase(“全部”)){
if(openCompleteInd.equalsIgnoreCase(OPEN\u COMPLETE\u IND\O)){
add(cb.equal(sl.get(完成日期),开始日期));
}else if(openCompleteInd.equalsIgnoreCase(OPEN\u COMPLETE\u IND\u C)){
add(cb.notEqual(sl.get(完成日期),开始日期));
}
}
if(termInd!=null&!termInd.equalsIgnoreCase(“全部”)){
if(终止相等信号情况(终止){
谓词termEToStart=cb.equal(sld.get(终止日期)、开始日期);
谓词termGTCurrentDate=cb.greaterThan(sld.get(终止日期),currentDate);
add(cb.or(termEToStart,termtcurrentdate));
}else if(终止相等信号情况(术语独立术语)){
谓词termGTStartDate=cb.greaterThan(sld.get(终止日期)、开始日期);
谓词termLTOETCurrentDate=cb.LESSTHANORREQUALTO(sld.get(终止日期),currentDate);
add(cb.and(termGTStartDate,termlotecurrentdate));
}
}
if(dateFrom!=null&!dateFrom.isEmpty()){
add(cb.between(sld.get(SERVICE_LETTER_DATE)、dateFrom、dateTo));
}
if(pinPrefix!=null&&pinPrefix.isEmpty()){
/*buff.append(“+setupwhere(pv,parms.get(ChooseQuery.PIN\u PREFIX\u KEY),true,3)+”中的A.SER\u NO\u PFX)*/
}
选择(sl);
cq.where(谓词.toArray(新谓词[]{}));
TypedQueryq=em.createQuery(cq);
返回q.getResultList();
}
私有谓词pipppindcodeclause(CriteriaBuilder cb,根sld,字符串letterType){
谓词pipppindcode=null;
谓词predTemp1=null;
谓词predTemp2=null;
谓词predTemp3=null;
谓词predTemp4=null;
ListserviceLetterNumberList=Arrays.asList(新字符串[]){
"956151",
"956170"
});
表达式ServiceLetterNumberPression=sld.get(服务字母编号);
if(letterType!=null&!letterType.equalsIgnoreCase(“全部”)){
开关(字体){
案例“pip”:
pipppindcode=cb.like(sld.get(服务字母编号),“94%”;
打破
案例“pipsaf”:
predTemp1=cb.like(sld.get(服务字母编号),“940%”;
predTemp2=cb.like(sld.get(服务字母编号),“941%”;