@@ -529,6 +529,30 @@ void testCountDistinct() {
529
529
530
530
@ Test
531
531
void testHaving () {
532
+ try (SqlSession session = sqlSessionFactory .openSession ()) {
533
+ CommonSelectMapper mapper = session .getMapper (CommonSelectMapper .class );
534
+
535
+ SelectStatementProvider selectStatement = select (lastName , count ())
536
+ .from (person )
537
+ .groupBy (lastName )
538
+ .having (count (), isEqualTo (3L ))
539
+ .and (lastName , isEqualTo ("Rubble" ))
540
+ .build ()
541
+ .render (RenderingStrategies .MYBATIS3 );
542
+
543
+ String expected = "select last_name, count(*) from Person group by last_name " +
544
+ "having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR}" ;
545
+ assertThat (selectStatement .getSelectStatement ()).isEqualTo (expected );
546
+
547
+ List <Map <String , Object >> rows = mapper .selectManyMappedRows (selectStatement );
548
+ assertThat (rows ).hasSize (1 );
549
+ Map <String , Object > row = rows .get (0 );
550
+ assertThat (row ).containsEntry ("LAST_NAME" , "Rubble" );
551
+ }
552
+ }
553
+
554
+ @ Test
555
+ void testHavingAndOrderBy () {
532
556
try (SqlSession session = sqlSessionFactory .openSession ()) {
533
557
CommonSelectMapper mapper = session .getMapper (CommonSelectMapper .class );
534
558
@@ -549,4 +573,93 @@ void testHaving() {
549
573
assertThat (row ).containsEntry ("LAST_NAME" , "Rubble" );
550
574
}
551
575
}
576
+
577
+ @ Test
578
+ void testHavingWithGroup () {
579
+ try (SqlSession session = sqlSessionFactory .openSession ()) {
580
+ CommonSelectMapper mapper = session .getMapper (CommonSelectMapper .class );
581
+
582
+ SelectStatementProvider selectStatement = select (lastName , count ())
583
+ .from (person )
584
+ .groupBy (lastName )
585
+ .having (group (count (), isEqualTo (3L ), and (lastName , isEqualTo ("Rubble" ))))
586
+ .limit (1 )
587
+ .build ()
588
+ .render (RenderingStrategies .MYBATIS3 );
589
+
590
+ String expected = "select last_name, count(*) from Person group by last_name " +
591
+ "having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR} " +
592
+ "limit #{parameters.p3}" ;
593
+ assertThat (selectStatement .getSelectStatement ()).isEqualTo (expected );
594
+
595
+ List <Map <String , Object >> rows = mapper .selectManyMappedRows (selectStatement );
596
+ assertThat (rows ).hasSize (1 );
597
+ Map <String , Object > row = rows .get (0 );
598
+ assertThat (row ).containsEntry ("LAST_NAME" , "Rubble" );
599
+ }
600
+ }
601
+
602
+ @ Test
603
+ void testHavingWithUnion () {
604
+ try (SqlSession session = sqlSessionFactory .openSession ()) {
605
+ CommonSelectMapper mapper = session .getMapper (CommonSelectMapper .class );
606
+
607
+ SelectStatementProvider selectStatement = select (lastName , count ())
608
+ .from (person )
609
+ .groupBy (lastName )
610
+ .having (group (count (), isEqualTo (3L ), and (lastName , isEqualTo ("Rubble" ))))
611
+ .union ()
612
+ .select (lastName , count ())
613
+ .from (person )
614
+ .groupBy (lastName )
615
+ .having (group (count (), isGreaterThan (1L ), and (lastName , isEqualTo ("Flintstone" ))))
616
+ .fetchFirst (5 ).rowsOnly ()
617
+ .build ()
618
+ .render (RenderingStrategies .MYBATIS3 );
619
+
620
+ String expected = "select last_name, count(*) from Person group by last_name " +
621
+ "having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR} " +
622
+ "union select last_name, count(*) from Person group by last_name " +
623
+ "having count(*) > #{parameters.p3} and last_name = #{parameters.p4,jdbcType=VARCHAR} " +
624
+ "fetch first #{parameters.p5} rows only" ;
625
+ assertThat (selectStatement .getSelectStatement ()).isEqualTo (expected );
626
+
627
+ List <Map <String , Object >> rows = mapper .selectManyMappedRows (selectStatement );
628
+ assertThat (rows ).hasSize (2 );
629
+ Map <String , Object > row = rows .get (0 );
630
+ assertThat (row ).containsEntry ("LAST_NAME" , "Flintstone" );
631
+ }
632
+ }
633
+
634
+ @ Test
635
+ void testHavingWithUnionAll () {
636
+ try (SqlSession session = sqlSessionFactory .openSession ()) {
637
+ CommonSelectMapper mapper = session .getMapper (CommonSelectMapper .class );
638
+
639
+ SelectStatementProvider selectStatement = select (lastName , count ())
640
+ .from (person )
641
+ .groupBy (lastName )
642
+ .having (group (count (), isEqualTo (3L ), and (lastName , isEqualTo ("Rubble" ))))
643
+ .unionAll ()
644
+ .select (lastName , count ())
645
+ .from (person )
646
+ .groupBy (lastName )
647
+ .having (group (count (), isGreaterThan (1L ), and (lastName , isEqualTo ("Flintstone" ))))
648
+ .offset (1 )
649
+ .build ()
650
+ .render (RenderingStrategies .MYBATIS3 );
651
+
652
+ String expected = "select last_name, count(*) from Person group by last_name " +
653
+ "having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR} " +
654
+ "union all select last_name, count(*) from Person group by last_name " +
655
+ "having count(*) > #{parameters.p3} and last_name = #{parameters.p4,jdbcType=VARCHAR} " +
656
+ "offset #{parameters.p5} rows" ;
657
+ assertThat (selectStatement .getSelectStatement ()).isEqualTo (expected );
658
+
659
+ List <Map <String , Object >> rows = mapper .selectManyMappedRows (selectStatement );
660
+ assertThat (rows ).hasSize (1 );
661
+ Map <String , Object > row = rows .get (0 );
662
+ assertThat (row ).containsEntry ("LAST_NAME" , "Flintstone" );
663
+ }
664
+ }
552
665
}
0 commit comments