@@ -45,23 +45,33 @@ import javax.persistence.criteria.JoinType
45
45
*
46
46
* Don't use this directly because it's an <string>INTERNAL</strong> class.
47
47
* It does not support backward compatibility.
48
+ * This class should be used with the understanding that it is not thread safe and therefore not suitable for parallel processing.
48
49
*/
49
50
open class QueryDslImpl <T >(
50
51
private val returnType : Class <T >,
51
52
) : CriteriaQueryDsl<T>, SubqueryDsl<T>, CriteriaUpdateQueryDsl, CriteriaDeleteQueryDsl {
52
53
private var singleSelectClause: SingleSelectClause <T >? = null
53
54
private var multiSelectClause: MultiSelectClause <T >? = null
54
55
private var fromClause: FromClause <* >? = null
55
- private var joins: MutableList <JoinSpec <* >> = mutableListOf ()
56
- private var wheres: MutableList <PredicateSpec > = mutableListOf ()
57
- private var groupBys: MutableList <ExpressionSpec <* >> = mutableListOf ()
58
- private var havings: MutableList <PredicateSpec > = mutableListOf ()
59
- private var orderBys: MutableList <OrderSpec > = mutableListOf ()
56
+ private var joins: MutableList <JoinSpec <* >>? = null
57
+ private var wheres: MutableList <PredicateSpec >? = null
58
+ private var groupBys: MutableList <ExpressionSpec <* >>? = null
59
+ private var havings: MutableList <PredicateSpec >? = null
60
+ private var orderBys: MutableList <OrderSpec >? = null
60
61
private var offset: Int? = null
61
62
private var maxResults: Int? = null
62
- private var sqlHints: MutableList <String > = mutableListOf ()
63
- private var jpaHints: MutableMap <String , Any > = mutableMapOf ()
64
- private var params: MutableMap <ColumnSpec <* >, Any? > = mutableMapOf ()
63
+ private var sqlHints: MutableList <String >? = null
64
+ private var jpaHints: MutableMap <String , Any >? = null
65
+ private var params: MutableMap <ColumnSpec <* >, Any? > ? = null
66
+
67
+ private fun lazyJoins () = (joins ? : mutableListOf<JoinSpec <* >>().apply { joins = this })
68
+ private fun lazyWheres () = (wheres ? : mutableListOf<PredicateSpec >().apply { wheres = this })
69
+ private fun lazyGroupBys () = (groupBys ? : mutableListOf<ExpressionSpec <* >>().apply { groupBys = this })
70
+ private fun lazyHavings () = (havings ? : mutableListOf<PredicateSpec >().apply { havings = this })
71
+ private fun lazyOrderBys () = (orderBys ? : mutableListOf<OrderSpec >().apply { orderBys = this })
72
+ private fun lazySqlHints () = (sqlHints ? : mutableListOf<String >().apply { sqlHints = this })
73
+ private fun lazyJpaHints () = (jpaHints ? : mutableMapOf<String , Any >().apply { jpaHints = this })
74
+ private fun lazyParams () = (params ? : mutableMapOf<ColumnSpec <* >, Any? > ().apply { params = this })
65
75
66
76
override fun select (distinct : Boolean , expression : ExpressionSpec <T >): SingleSelectClause <T > {
67
77
return SingleSelectClause (
@@ -84,12 +94,12 @@ open class QueryDslImpl<T>(
84
94
}
85
95
86
96
override fun <T , R > join (left : EntitySpec <T >, right : EntitySpec <R >, relation : Relation <T , R ?>, joinType : JoinType ) {
87
- joins .add(SimpleJoinSpec (left = left, right = right, path = relation.path, joinType = joinType))
97
+ lazyJoins() .add(SimpleJoinSpec (left = left, right = right, path = relation.path, joinType = joinType))
88
98
}
89
99
90
100
override fun <T > join (entity : EntitySpec <T >, predicate : PredicateSpec ) {
91
- joins .add(CrossJoinSpec (entity))
92
- wheres .add(predicate)
101
+ lazyJoins() .add(CrossJoinSpec (entity))
102
+ lazyWheres() .add(predicate)
93
103
}
94
104
95
105
override fun <T , R > associate (
@@ -98,7 +108,7 @@ open class QueryDslImpl<T>(
98
108
relation : Relation <T , R ?>,
99
109
joinType : JoinType
100
110
) {
101
- joins .add(SimpleAssociatedJoinSpec (left = left, right = right, path = relation.path))
111
+ lazyJoins() .add(SimpleAssociatedJoinSpec (left = left, right = right, path = relation.path))
102
112
}
103
113
104
114
override fun <T , R > fetch (
@@ -107,23 +117,23 @@ open class QueryDslImpl<T>(
107
117
relation : Relation <T , R ?>,
108
118
joinType : JoinType
109
119
) {
110
- joins .add(FetchJoinSpec (left = left, right = right, path = relation.path, joinType = joinType))
120
+ lazyJoins() .add(FetchJoinSpec (left = left, right = right, path = relation.path, joinType = joinType))
111
121
}
112
122
113
123
override fun where (predicate : PredicateSpec ) {
114
- wheres .add(predicate)
124
+ lazyWheres() .add(predicate)
115
125
}
116
126
117
127
override fun groupBy (columns : List <ExpressionSpec <* >>) {
118
- groupBys .addAll(columns)
128
+ lazyGroupBys() .addAll(columns)
119
129
}
120
130
121
131
override fun having (predicate : PredicateSpec ) {
122
- havings .add(predicate)
132
+ lazyHavings() .add(predicate)
123
133
}
124
134
125
135
override fun orderBy (orders : List <OrderSpec >) {
126
- orderBys .addAll(orders)
136
+ lazyOrderBys() .addAll(orders)
127
137
}
128
138
129
139
override fun offset (offset : Int ) {
@@ -135,19 +145,19 @@ open class QueryDslImpl<T>(
135
145
}
136
146
137
147
override fun sqlHints (hints : List <String >) {
138
- sqlHints .addAll(hints)
148
+ lazySqlHints() .addAll(hints)
139
149
}
140
150
141
151
override fun hints (hints : Map <String , Any >) {
142
- jpaHints .putAll(hints)
152
+ lazyJpaHints() .putAll(hints)
143
153
}
144
154
145
155
override fun setParams (params : Map <ColumnSpec <* >, Any? >) {
146
- this .params .putAll(params)
156
+ lazyParams() .putAll(params)
147
157
}
148
158
149
159
override fun set (column : ColumnSpec <* >, value : Any? ) {
150
- params [column] = value
160
+ lazyParams() [column] = value
151
161
}
152
162
153
163
fun createCriteriaQuerySpec (): CriteriaQuerySpec <T , TypedQuery <T >> {
@@ -174,10 +184,13 @@ open class QueryDslImpl<T>(
174
184
where = getWhereClause(),
175
185
sqlHint = getSqlQueryHintClause(),
176
186
jpaHint = getJpaQueryHintClause(),
177
- set = SetClause (params )
187
+ set = getSetClause( )
178
188
)
179
189
}
180
190
191
+ @Suppress(" MemberVisibilityCanBePrivate" )
192
+ protected fun getSetClause () = SetClause (params.orEmpty())
193
+
181
194
@Suppress(" UNCHECKED_CAST" )
182
195
fun createCriteriaDeleteQuerySpec (): CriteriaDeleteQuerySpec <T , Query > {
183
196
return CriteriaDeleteQuerySpecImpl (
@@ -224,30 +237,32 @@ open class QueryDslImpl<T>(
224
237
225
238
@Suppress(" MemberVisibilityCanBePrivate" )
226
239
protected fun getJoinClause (): JoinClause {
227
- return JoinClause (joins)
240
+ return JoinClause (joins.orEmpty() )
228
241
}
229
242
230
243
@Suppress(" MemberVisibilityCanBePrivate" )
231
244
protected fun getJoinClauseDoesNotHaveFetch (): JoinClause {
232
- mustBe(joins.filterIsInstance<FetchJoinSpec <* , * >>().isEmpty()) { " This query does not support fetch" }
245
+ mustBe(joins.orEmpty(). filterIsInstance<FetchJoinSpec <* , * >>().isEmpty()) { " This query does not support fetch" }
233
246
234
247
return getJoinClause()
235
248
}
236
249
250
+ @Suppress(" MemberVisibilityCanBePrivate" )
237
251
protected fun getSimpleAssociatedJoinClauseOnly (): SimpleAssociatedJoinClause {
252
+ val joins = joins.orEmpty()
238
253
return joins.filterIsInstance<SimpleAssociatedJoinSpec <* , * >>().let {
239
254
mustBe(it.size == joins.size) { " This query only support associate" }
240
255
SimpleAssociatedJoinClause (it)
241
256
}
242
257
}
243
258
244
259
protected fun getWhereClause (): WhereClause {
245
- return WhereClause (wheres.merge())
260
+ return WhereClause (wheres.orEmpty(). merge())
246
261
}
247
262
248
263
@Suppress(" MemberVisibilityCanBePrivate" )
249
264
protected fun getGroupByClause (): GroupByClause {
250
- return GroupByClause (groupBys)
265
+ return GroupByClause (groupBys.orEmpty() )
251
266
}
252
267
253
268
protected fun getEmptyGroupByClause (): GroupByClause {
@@ -256,7 +271,7 @@ open class QueryDslImpl<T>(
256
271
257
272
@Suppress(" MemberVisibilityCanBePrivate" )
258
273
protected fun getHavingClause (): HavingClause {
259
- return HavingClause (havings.merge())
274
+ return HavingClause (havings.orEmpty(). merge())
260
275
}
261
276
262
277
protected fun getEmptyHavingClause (): HavingClause {
@@ -265,7 +280,7 @@ open class QueryDslImpl<T>(
265
280
266
281
@Suppress(" MemberVisibilityCanBePrivate" )
267
282
protected fun getOrderByClause (): CriteriaQueryOrderByClause {
268
- return OrderByClause (orderBys)
283
+ return OrderByClause (orderBys.orEmpty() )
269
284
}
270
285
271
286
protected fun getEmptyOrderByClause (): CriteriaQueryOrderByClause {
@@ -282,12 +297,12 @@ open class QueryDslImpl<T>(
282
297
}
283
298
284
299
protected fun <Q : Query > getJpaQueryHintClause (): JpaQueryHintClause <Q > {
285
- return JpaQueryHintClauseImpl (jpaHints)
300
+ return JpaQueryHintClauseImpl (jpaHints.orEmpty() )
286
301
}
287
302
288
303
@Suppress(" UNCHECKED_CAST" )
289
304
protected fun <Q : Query > getSqlQueryHintClause (): SqlQueryHintClause <Q > {
290
- return SqlQueryHintClauseProvider .provide(sqlHints) as SqlQueryHintClause <Q >
305
+ return SqlQueryHintClauseProvider .provide(sqlHints.orEmpty() ) as SqlQueryHintClause <Q >
291
306
}
292
307
293
308
@Suppress(" MemberVisibilityCanBePrivate" )
0 commit comments