@@ -2585,132 +2585,8 @@ else if (StringUtil.isNotEmpty(andWhere, true)) { // andWhere 必须放后面
25852585setPreparedValueList (prepreadValues );
25862586}
25872587
2588- if (joinList != null ) {
2589-
2590- String newWs = "" ;
2591- String ws = whereString ;
2592-
2593- List <Object > newPvl = new ArrayList <>();
2594- List <Object > pvl = new ArrayList <>(getPreparedValueList ());
2595-
2596- SQLConfig jc ;
2597- String js ;
2598-
2599- boolean changed = false ;
2600- //各种 JOIN 没办法统一用 & | !连接,只能按优先级,和 @combine 一样?
2601- for (Join j : joinList ) {
2602- String jt = j .getJoinType ();
2603-
2604- switch (jt ) {
2605- case "*" : // CROSS JOIN
2606- case "@" : // APP JOIN
2607- case "<" : // LEFT JOIN
2608- case ">" : // RIGHT JOIN
2609- break ;
2610-
2611- case "&" : // INNER JOIN: A & B
2612- case "" : // FULL JOIN: A | B
2613- case "|" : // FULL JOIN: A | B
2614- case "!" : // OUTER JOIN: ! (A | B)
2615- case "^" : // SIDE JOIN: ! (A & B)
2616- case "(" : // ANTI JOIN: A & ! B
2617- case ")" : // FOREIGN JOIN: B & ! A
2618- jc = j .getJoinConfig ();
2619- boolean isMain = jc .isMain ();
2620- jc .setMain (false ).setPrepared (isPrepared ()).setPreparedValueList (new ArrayList <Object >());
2621- js = jc .getWhereString (false );
2622- jc .setMain (isMain );
2623-
2624- boolean isOuterJoin = "!" .equals (jt );
2625- boolean isSideJoin = "^" .equals (jt );
2626- boolean isAntiJoin = "(" .equals (jt );
2627- boolean isForeignJoin = ")" .equals (jt );
2628- boolean isWsEmpty = StringUtil .isEmpty (ws , true );
2629-
2630- if (isWsEmpty ) {
2631- if (isOuterJoin ) { // ! OUTER JOIN: ! (A | B)
2632- throw new NotExistException ("no result for ! OUTER JOIN( ! (A | B) ) when A or B is empty!" );
2633- }
2634- if (isForeignJoin ) { // ) FOREIGN JOIN: B & ! A
2635- throw new NotExistException ("no result for ) FOREIGN JOIN( B & ! A ) when A is empty!" );
2636- }
2637- }
2638-
2639- if (StringUtil .isEmpty (js , true )) {
2640- if (isOuterJoin ) { // ! OUTER JOIN: ! (A | B)
2641- throw new NotExistException ("no result for ! OUTER JOIN( ! (A | B) ) when A or B is empty!" );
2642- }
2643- if (isAntiJoin ) { // ( ANTI JOIN: A & ! B
2644- throw new NotExistException ("no result for ( ANTI JOIN( A & ! B ) when B is empty!" );
2645- }
2646-
2647- if (isWsEmpty ) {
2648- if (isSideJoin ) {
2649- throw new NotExistException ("no result for ^ SIDE JOIN( ! (A & B) ) when both A and B are empty!" );
2650- }
2651- }
2652- else {
2653- if (isSideJoin || isForeignJoin ) {
2654- newWs += " ( " + getCondition (true , ws ) + " ) " ;
2655-
2656- newPvl .addAll (pvl );
2657- newPvl .addAll (jc .getPreparedValueList ());
2658- changed = true ;
2659- }
2660- }
2661-
2662- continue ;
2663- }
2664-
2665- if (StringUtil .isEmpty (newWs , true ) == false ) {
2666- newWs += AND ;
2667- }
2668-
2669- if (isAntiJoin ) { // ( ANTI JOIN: A & ! B
2670- newWs += " ( " + ( isWsEmpty ? "" : ws + AND ) + NOT + " ( " + js + " ) " + " ) " ;
2671- }
2672- else if (isForeignJoin ) { // ) FOREIGN JOIN: (! A) & B // preparedValueList.add 不好反过来 B & ! A
2673- newWs += " ( " + NOT + " ( " + ws + " ) ) " + AND + " ( " + js + " ) " ;
2674- }
2675- else if (isSideJoin ) { // ^ SIDE JOIN: ! (A & B)
2676- //MySQL 因为 NULL 值处理问题,(A & ! B) | (B & ! A) 与 ! (A & B) 返回结果不一样,后者往往更多
2677- newWs += " ( " + getCondition (
2678- true ,
2679- ( isWsEmpty ? "" : ws + AND ) + " ( " + js + " ) "
2680- ) + " ) " ;
2681- }
2682- else { // & INNER JOIN: A & B; | FULL JOIN: A | B; OUTER JOIN: ! (A | B)
2683- int logic = Logic .getType (jt );
2684- newWs += " ( "
2685- + getCondition (
2686- Logic .isNot (logic ),
2687- ws
2688- + ( isWsEmpty ? "" : (Logic .isAnd (logic ) ? AND : OR ) )
2689- + " ( " + js + " ) "
2690- )
2691- + " ) " ;
2692- }
2693-
2694- newPvl .addAll (pvl );
2695- newPvl .addAll (jc .getPreparedValueList ());
2696-
2697- changed = true ;
2698- break ;
2699- default :
2700- throw new UnsupportedOperationException (
2701- "join:value 中 value 里的 " + jt + "/" + j .getPath ()
2702- + "错误!不支持 " + jt + " 等 [ @ APP, < LEFT, > RIGHT, * CROSS"
2703- + ", & INNER, | FULL, ! OUTER, ^ SIDE, ( ANTI, ) FOREIGN ] 之外的 JOIN 类型 !"
2704- );
2705- }
2706- }
2707-
2708- if (changed ) {
2709- whereString = newWs ;
2710- setPreparedValueList (newPvl );
2711- }
2712- }
2713-
2588+ whereString = concatJoinWhereString (whereString );
2589+
27142590String result = StringUtil .isEmpty (whereString , true ) ? "" : (hasPrefix ? " WHERE " : "" ) + whereString ;
27152591
27162592if (result .isEmpty () && RequestMethod .isQueryMethod (method ) == false ) {
@@ -2721,7 +2597,6 @@ else if (isSideJoin) { // ^ SIDE JOIN: ! (A & B)
27212597}
27222598
27232599
2724-
27252600public String getWhereString (boolean hasPrefix , RequestMethod method , Map <String , Object > where , Map <String , List <String >> combine , List <Join > joinList , boolean verifyName ) throws Exception {
27262601Set <Entry <String , List <String >>> combineSet = combine == null ? null : combine .entrySet ();
27272602if (combineSet == null || combineSet .isEmpty ()) {
@@ -2776,15 +2651,28 @@ else if ("!".equals(ce.getKey())) {
27762651whereString += (isCombineFirst ? "" : AND ) + (Logic .isNot (logic ) ? NOT : "" ) + " ( " + cs + " ) " ;
27772652isCombineFirst = false ;
27782653}
2654+
2655+ whereString = concatJoinWhereString (whereString );
27792656
2657+ String s = StringUtil .isEmpty (whereString , true ) ? "" : (hasPrefix ? " WHERE " : "" ) + whereString ;
27802658
2659+ if (s .isEmpty () && RequestMethod .isQueryMethod (method ) == false ) {
2660+ throw new UnsupportedOperationException ("写操作请求必须带条件!!!" );
2661+ }
2662+
2663+ return s ;
2664+ }
2665+
2666+
2667+ protected String concatJoinWhereString (String whereString ) throws Exception {
2668+ List <Join > joinList = getJoinList ();
27812669if (joinList != null ) {
27822670
27832671String newWs = "" ;
27842672String ws = whereString ;
27852673
27862674List <Object > newPvl = new ArrayList <>();
2787- List <Object > pvl = new ArrayList <>(preparedValueList );
2675+ List <Object > pvl = new ArrayList <>(getPreparedValueList () );
27882676
27892677SQLConfig jc ;
27902678String js ;
@@ -2873,7 +2761,7 @@ else if (isSideJoin) { // ^ SIDE JOIN: ! (A & B)
28732761) + " ) " ;
28742762}
28752763else { // & INNER JOIN: A & B; | FULL JOIN: A | B; OUTER JOIN: ! (A | B)
2876- logic = Logic .getType (jt );
2764+ int logic = Logic .getType (jt );
28772765newWs += " ( "
28782766+ getCondition (
28792767Logic .isNot (logic ),
@@ -2900,19 +2788,14 @@ else if (isSideJoin) { // ^ SIDE JOIN: ! (A & B)
29002788
29012789if (changed ) {
29022790whereString = newWs ;
2903- preparedValueList = newPvl ;
2791+ setPreparedValueList ( newPvl ) ;
29042792}
29052793}
29062794
2907- String s = StringUtil .isEmpty (whereString , true ) ? "" : (hasPrefix ? " WHERE " : "" ) + whereString ;
2908-
2909- if (s .isEmpty () && RequestMethod .isQueryMethod (method ) == false ) {
2910- throw new UnsupportedOperationException ("写操作请求必须带条件!!!" );
2911- }
2912-
2913- return s ;
2795+ return whereString ;
29142796}
29152797
2798+
29162799/**
29172800 * @param key
29182801 * @param value
0 commit comments