@@ -373,14 +373,41 @@ public AbstractSQLConfig setHaving(String having) {
373373 */
374374 @ JSONField (serialize = false )
375375 public String getHavingString (boolean hasPrefix ) {
376- having = StringUtil .getTrimedString (having );
377- if (having .isEmpty ()) {
378- return "" ;
379- }
376+ //加上子表的 having
377+ String joinHaving = "" ;
378+ if (joinList != null ) {
379+ SQLConfig ecfg ;
380+ SQLConfig cfg ;
381+ String c ;
382+ boolean first = true ;
383+ for (Join j : joinList ) {
384+ if (j .isAppJoin ()) {
385+ continue ;
386+ }
380387
388+ ecfg = j .getOutterConfig ();
389+ if (ecfg != null && ecfg .getHaving () != null ) { //优先级更高
390+ cfg = ecfg ;
391+ }
392+ else {
393+ cfg = j .getJoinConfig ();
394+ }
395+
396+ cfg .setAlias (cfg .getTable ());
397+
398+ c = ((AbstractSQLConfig ) cfg ).getHavingString (false );
399+ if (StringUtil .isEmpty (c , true ) == false ) {
400+ joinHaving += (first ? "" : ", " ) + c ;
401+ first = false ;
402+ }
403+
404+ }
405+ }
406+
407+ having = StringUtil .getTrimedString (having );
381408 String [] keys = StringUtil .split (having , ";" );
382409 if (keys == null || keys .length <= 0 ) {
383- return "" ;
410+ return StringUtil . isEmpty ( joinHaving , true ) ? "" : ( hasPrefix ? " HAVING " : "" ) + joinHaving ;
384411 }
385412
386413 String expression ;
@@ -444,7 +471,8 @@ public String getHavingString(boolean hasPrefix) {
444471 keys [i ] = method + "(" + StringUtil .getString (ckeys ) + ")" + suffix ;
445472 }
446473
447- return " HAVING " + StringUtil .getString (keys , AND ); //TODO 支持 OR, NOT 参考 @combine:"&key0,|key1,!key2"
474+ //TODO 支持 OR, NOT 参考 @combine:"&key0,|key1,!key2"
475+ return (hasPrefix ? " HAVING " : "" ) + StringUtil .concat (StringUtil .getString (keys , AND ), joinHaving , AND );
448476 }
449477
450478 @ Override
0 commit comments