import
static
examples
.
groupby
.
AddressDynamicSqlSupport
.*;
import
static
examples
.
groupby
.
Person2DynamicSqlSupport
.
person2
;
import
static
examples
.
groupby
.
PersonDynamicSqlSupport
.*;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
import
static
org
.
mybatis
.
dynamic
.
sql
.
SqlBuilder
.*;
import
java
.
io
.
InputStream
;
import
java
.
io
.
InputStreamReader
;
import
java
.
sql
.
Connection
;
import
java
.
sql
.
DriverManager
;
import
java
.
util
.
List
;
import
java
.
util
.
Map
;
import
org
.
apache
.
ibatis
.
datasource
.
unpooled
.
UnpooledDataSource
;
import
org
.
apache
.
ibatis
.
jdbc
.
ScriptRunner
;
import
org
.
apache
.
ibatis
.
mapping
.
Environment
;
import
org
.
apache
.
ibatis
.
session
.
Configuration
;
import
org
.
apache
.
ibatis
.
session
.
SqlSession
;
import
org
.
apache
.
ibatis
.
session
.
SqlSessionFactory
;
import
org
.
apache
.
ibatis
.
session
.
SqlSessionFactoryBuilder
;
import
org
.
apache
.
ibatis
.
transaction
.
jdbc
.
JdbcTransactionFactory
;
import
org
.
junit
.
jupiter
.
api
.
BeforeEach
;
import
org
.
junit
.
jupiter
.
api
.
Test
;
import
org
.
mybatis
.
dynamic
.
sql
.
render
.
RenderingStrategies
;
import
org
.
mybatis
.
dynamic
.
sql
.
select
.
HavingApplier
;
import
org
.
mybatis
.
dynamic
.
sql
.
select
.
render
.
SelectStatementProvider
;
import
org
.
mybatis
.
dynamic
.
sql
.
util
.
mybatis3
.
CommonSelectMapper
;
private
static
final
String
JDBC_URL
=
"jdbc:hsqldb:mem:aname"
;
private
static
final
String
JDBC_DRIVER
=
"org.hsqldb.jdbcDriver"
;
private
SqlSessionFactory
sqlSessionFactory
;
void
setup
()
throws
Exception
{
Class
.
forName
(
JDBC_DRIVER
);
InputStream
is
=
getClass
().
getResourceAsStream
(
"/examples/groupby/CreateGroupByDB.sql"
);
try
(
Connection
connection
=
DriverManager
.
getConnection
(
JDBC_URL
,
"sa"
,
""
)) {
ScriptRunner
sr
=
new
ScriptRunner
(
connection
);
sr
.
setLogWriter
(
null
);
sr
.
runScript
(
new
InputStreamReader
(
is
));
UnpooledDataSource
ds
=
new
UnpooledDataSource
(
JDBC_DRIVER
,
JDBC_URL
,
"sa"
,
""
);
Environment
environment
=
new
Environment
(
"test"
,
new
JdbcTransactionFactory
(),
ds
);
Configuration
config
=
new
Configuration
(
environment
);
config
.
addMapper
(
CommonSelectMapper
.
class
);
sqlSessionFactory
=
new
SqlSessionFactoryBuilder
().
build
(
config
);
void
testBasicGroupBy
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
gender
,
count
())
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select gender, count(*) from Person group by gender"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
2
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"GENDER"
,
"Male"
);
assertThat
(
row
).
containsEntry
(
"C2"
,
4L
);
assertThat
(
row
).
containsEntry
(
"GENDER"
,
"Female"
);
assertThat
(
row
).
containsEntry
(
"C2"
,
3L
);
void
testBasicGroupByWithAggregateAlias
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
gender
,
count
().
as
(
"count"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select gender, count(*) as count from Person group by gender"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
2
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"GENDER"
,
"Male"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
4L
);
assertThat
(
row
).
containsEntry
(
"GENDER"
,
"Female"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
void
testGroupByAfterJoin
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
streetAddress
,
count
().
as
(
"count"
))
.
from
(
person
,
"p"
).
join
(
address
,
"a"
).
on
(
person
.
addressId
,
equalTo
(
address
.
id
))
.
groupBy
(
lastName
,
streetAddress
)
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select p.last_name, a.street_address, count(*) as count"
+
" from Person p join Address a on p.address_id = a.address_id"
+
" group by p.last_name, a.street_address"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
2
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Flintstone"
);
assertThat
(
row
).
containsEntry
(
"STREET_ADDRESS"
,
"123 Main Street"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
4L
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
assertThat
(
row
).
containsEntry
(
"STREET_ADDRESS"
,
"456 Main Street"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
void
testUnionAfterJoin
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
firstName
,
streetAddress
)
.
from
(
person
,
"p"
).
join
(
address
,
"a"
).
on
(
person
.
addressId
,
equalTo
(
address
.
id
))
.
select
(
person2
.
lastName
,
person2
.
firstName
,
streetAddress
)
.
from
(
person2
,
"p"
).
join
(
address
,
"a"
).
on
(
person2
.
addressId
,
equalTo
(
address
.
id
))
.
orderBy
(
lastName
,
firstName
)
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select p.last_name, p.first_name, a.street_address"
+
" from Person p join Address a on p.address_id = a.address_id"
+
" select p.last_name, p.first_name, a.street_address"
+
" from Person2 p join Address a on p.address_id = a.address_id"
+
" order by last_name, first_name"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
10
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Flintstone"
);
assertThat
(
row
).
containsEntry
(
"FIRST_NAME"
,
"Dino"
);
assertThat
(
row
).
containsEntry
(
"STREET_ADDRESS"
,
"123 Main Street"
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Smith"
);
assertThat
(
row
).
containsEntry
(
"FIRST_NAME"
,
"Suzy"
);
assertThat
(
row
).
containsEntry
(
"STREET_ADDRESS"
,
"123 Main Street"
);
void
testUnionAllAfterJoin
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
firstName
,
streetAddress
)
.
from
(
person
,
"p"
).
join
(
address
,
"a"
).
on
(
person
.
addressId
,
equalTo
(
address
.
id
))
.
select
(
person2
.
lastName
,
person2
.
firstName
,
streetAddress
)
.
from
(
person2
,
"p"
).
join
(
address
,
"a"
).
on
(
person2
.
addressId
,
equalTo
(
address
.
id
))
.
orderBy
(
lastName
,
firstName
)
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select p.last_name, p.first_name, a.street_address"
+
" from Person p join Address a on p.address_id = a.address_id"
+
" select p.last_name, p.first_name, a.street_address"
+
" from Person2 p join Address a on p.address_id = a.address_id"
+
" order by last_name, first_name"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
10
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Flintstone"
);
assertThat
(
row
).
containsEntry
(
"FIRST_NAME"
,
"Dino"
);
assertThat
(
row
).
containsEntry
(
"STREET_ADDRESS"
,
"123 Main Street"
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Smith"
);
assertThat
(
row
).
containsEntry
(
"FIRST_NAME"
,
"Suzy"
);
assertThat
(
row
).
containsEntry
(
"STREET_ADDRESS"
,
"123 Main Street"
);
void
testUnionAfterGroupBy
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
stringConstant
(
"Gender"
),
gender
.
as
(
"value"
),
count
().
as
(
"count"
))
.
select
(
stringConstant
(
"Last Name"
),
lastName
.
as
(
"value"
),
count
().
as
(
"count"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select 'Gender', gender as value, count(*) as count from Person group by gender"
+
" select 'Last Name', last_name as value, count(*) as count from Person group by last_name"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
4
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"C1"
,
"Gender "
);
assertThat
(
row
).
containsEntry
(
"VALUE"
,
"Female"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
assertThat
(
row
).
containsEntry
(
"C1"
,
"Gender "
);
assertThat
(
row
).
containsEntry
(
"VALUE"
,
"Male"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
4L
);
assertThat
(
row
).
containsEntry
(
"C1"
,
"Last Name"
);
assertThat
(
row
).
containsEntry
(
"VALUE"
,
"Flintstone"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
4L
);
assertThat
(
row
).
containsEntry
(
"C1"
,
"Last Name"
);
assertThat
(
row
).
containsEntry
(
"VALUE"
,
"Rubble"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
void
testUnionAllAfterGroupBy
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
stringConstant
(
"Gender"
),
gender
.
as
(
"value"
),
count
().
as
(
"count"
))
.
select
(
stringConstant
(
"Last Name"
),
lastName
.
as
(
"value"
),
count
().
as
(
"count"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select 'Gender', gender as value, count(*) as count from Person group by gender"
+
" select 'Last Name', last_name as value, count(*) as count from Person group by last_name"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
4
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"C1"
,
"Gender "
);
assertThat
(
row
).
containsEntry
(
"VALUE"
,
"Male"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
4L
);
assertThat
(
row
).
containsEntry
(
"C1"
,
"Gender "
);
assertThat
(
row
).
containsEntry
(
"VALUE"
,
"Female"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
assertThat
(
row
).
containsEntry
(
"C1"
,
"Last Name"
);
assertThat
(
row
).
containsEntry
(
"VALUE"
,
"Flintstone"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
4L
);
assertThat
(
row
).
containsEntry
(
"C1"
,
"Last Name"
);
assertThat
(
row
).
containsEntry
(
"VALUE"
,
"Rubble"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
void
testBasicGroupByOrderByWithAggregateAlias
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
gender
,
count
().
as
(
"count"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select gender, count(*) as count from Person group by gender order by gender"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
2
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"GENDER"
,
"Female"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
assertThat
(
row
).
containsEntry
(
"GENDER"
,
"Male"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
4L
);
void
testBasicGroupByOrderByWithCalculatedColumnAndTableAlias
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
substring
(
gender
,
1
,
1
).
as
(
"ShortGender"
),
avg
(
age
).
as
(
"AverageAge"
))
.
groupBy
(
substring
(
gender
,
1
,
1
))
.
orderBy
(
sortColumn
(
"ShortGender"
).
descending
())
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select substring(a.gender, 1, 1) as ShortGender, avg(a.age) as AverageAge from Person a group by substring(a.gender, 1, 1) order by ShortGender DESC"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
2
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"SHORTGENDER"
,
"M"
);
assertThat
(
row
).
containsEntry
(
"AVERAGEAGE"
,
25
);
assertThat
(
row
).
containsEntry
(
"SHORTGENDER"
,
"F"
);
assertThat
(
row
).
containsEntry
(
"AVERAGEAGE"
,
27
);
void
testGroupByAfterWhere
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
().
as
(
"count"
))
.
where
(
gender
,
isEqualTo
(
"Male"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select a.last_name, count(*) as count from Person a where a.gender = #{parameters.p1,jdbcType=VARCHAR} group by a.last_name"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
2
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Flintstone"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
2L
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
2L
);
void
testLimitAndOffsetAfterGroupBy
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
().
as
(
"count"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) as count from Person group by last_name limit #{parameters.p1} offset #{parameters.p2}"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
void
testLimitOnlyAfterGroupBy
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
().
as
(
"count"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) as count from Person group by last_name limit #{parameters.p1}"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Flintstone"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
4L
);
void
testOffsetOnlyAfterGroupBy
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
().
as
(
"count"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) as count from Person group by last_name offset #{parameters.p1} rows"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
void
testOffsetAndFetchFirstAfterGroupBy
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
().
as
(
"count"
))
.
fetchFirst
(
1
).
rowsOnly
()
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) as count from Person group by last_name offset #{parameters.p1} rows fetch first #{parameters.p2} rows only"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
3L
);
void
testFetchFirstOnlyAfterGroupBy
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
().
as
(
"count"
))
.
fetchFirst
(
1
).
rowsOnly
()
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) as count from Person group by last_name fetch first #{parameters.p1} rows only"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Flintstone"
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
4L
);
void
testCountDistinct
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
countDistinct
(
lastName
).
as
(
"count"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select count(distinct last_name) as count from Person"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"COUNT"
,
2L
);
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
())
.
having
(
count
(),
isEqualTo
(
3L
))
.
and
(
lastName
,
isEqualTo
(
"Rubble"
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) from Person group by last_name "
+
"having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR}"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
void
testHavingAndOrderBy
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
())
.
having
(
count
(),
isEqualTo
(
3L
))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) from Person group by last_name having count(*) = #{parameters.p1} order by last_name"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
void
testHavingWithGroup
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
())
.
having
(
group
(
count
(),
isEqualTo
(
3L
),
and
(
lastName
,
isEqualTo
(
"Rubble"
))))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) from Person group by last_name "
+
"having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR} "
+
"limit #{parameters.p3}"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
void
testHavingWithUnion
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
())
.
having
(
group
(
count
(),
isEqualTo
(
3L
),
and
(
lastName
,
isEqualTo
(
"Rubble"
))))
.
select
(
lastName
,
count
())
.
having
(
group
(
count
(),
isGreaterThan
(
1L
),
and
(
lastName
,
isEqualTo
(
"Flintstone"
))))
.
fetchFirst
(
5
).
rowsOnly
()
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) from Person group by last_name "
+
"having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR} "
+
"union select last_name, count(*) from Person group by last_name "
+
"having count(*) > #{parameters.p3} and last_name = #{parameters.p4,jdbcType=VARCHAR} "
+
"fetch first #{parameters.p5} rows only"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
2
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Flintstone"
);
void
testHavingWithUnionAll
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
())
.
having
(
group
(
count
(),
isEqualTo
(
3L
),
and
(
lastName
,
isEqualTo
(
"Rubble"
))))
.
select
(
lastName
,
count
())
.
having
(
group
(
count
(),
isGreaterThan
(
1L
),
and
(
lastName
,
isEqualTo
(
"Flintstone"
))))
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) from Person group by last_name "
+
"having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR} "
+
"union all select last_name, count(*) from Person group by last_name "
+
"having count(*) > #{parameters.p3} and last_name = #{parameters.p4,jdbcType=VARCHAR} "
+
"offset #{parameters.p5} rows"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Flintstone"
);
void
testStandaloneHaving
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
())
.
applyHaving
(
commonHaving
)
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) from Person group by last_name "
+
"having count(*) = #{parameters.p1}"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
void
testComposedHaving
() {
try
(
SqlSession
session
=
sqlSessionFactory
.
openSession
()) {
CommonSelectMapper
mapper
=
session
.
getMapper
(
CommonSelectMapper
.
class
);
HavingApplier
composedHaving
=
commonHaving
.
andThen
(
d
->
d
.
and
(
lastName
,
isEqualTo
(
"Rubble"
)));
SelectStatementProvider
selectStatement
=
select
(
lastName
,
count
())
.
applyHaving
(
composedHaving
)
.
render
(
RenderingStrategies
.
MYBATIS3
);
String
expected
=
"select last_name, count(*) from Person group by last_name "
+
"having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR}"
;
assertThat
(
selectStatement
.
getSelectStatement
()).
isEqualTo
(
expected
);
List
<
Map
<
String
,
Object
>>
rows
=
mapper
.
selectManyMappedRows
(
selectStatement
);
assertThat
(
rows
).
hasSize
(
1
);
Map
<
String
,
Object
>
row
=
rows
.
get
(
0
);
assertThat
(
row
).
containsEntry
(
"LAST_NAME"
,
"Rubble"
);
private
final
HavingApplier
commonHaving
=
having
(
count
(),
isEqualTo
(
3L
)).
toHavingApplier
();