Skip to content

Commit 17d98d9

Browse files
committed
Add support for appending parameters in user-defined criteria
1 parent 3a4382a commit 17d98d9

File tree

10 files changed

+113
-13
lines changed

10 files changed

+113
-13
lines changed

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/UserDefinedCriteriaContext.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ interface Builder {
5454
*/
5555
void appendExpression(PropertyMetamodel<?> propertyMetamodel);
5656

57+
/**
58+
* Appends a parameter.
59+
*
60+
* @param left the property metamodel representing the left operand
61+
* @param right the value to be paired with the left operand
62+
* @param <PROPERTY> the type of the property
63+
*/
64+
<PROPERTY> void appendParameter(PropertyMetamodel<PROPERTY> left, PROPERTY right);
65+
5766
/**
5867
* Represents the specific database dialect. This is utilized to modify user-defined expressions
5968
* based on the dialect in use.

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/BuilderSupport.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,13 @@ public void appendExpression(PropertyMetamodel<?> propertyMetamodel) {
957957
propertyMetamodel.accept(propertyMetamodelVisitor);
958958
}
959959

960+
@Override
961+
public <PROPERTY> void appendParameter(PropertyMetamodel<PROPERTY> left, PROPERTY right) {
962+
var param = new Operand.Param(left, right);
963+
var parameter = param.createInParameter(config);
964+
param(parameter);
965+
}
966+
960967
@Override
961968
public Dialect getDialect() {
962969
return config.getDialect();

doma-core/src/test/java/org/seasar/doma/jdbc/criteria/MyExtension.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,28 @@
1616
package org.seasar.doma.jdbc.criteria;
1717

1818
import org.seasar.doma.jdbc.criteria.declaration.UserDefinedCriteriaContext;
19-
import org.seasar.doma.jdbc.criteria.expression.Expressions;
2019
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
2120

2221
record MyExtension(UserDefinedCriteriaContext context) {
23-
public void likeMultiple(PropertyMetamodel<?> entityMetamodel, String... patterns) {
22+
public void likeMultiple(PropertyMetamodel<String> entityMetamodel, String... patterns) {
2423
context.add(
2524
(b) -> {
2625
for (String pattern : patterns) {
2726
b.appendExpression(entityMetamodel);
2827
b.appendSql(" like ");
29-
b.appendExpression(Expressions.literal("%" + pattern + "%"));
28+
b.appendParameter(entityMetamodel, "%" + pattern + "%");
3029
b.appendSql(" or ");
3130
}
3231
b.cutBackSql(4);
3332
});
3433
}
34+
35+
public void eq2(PropertyMetamodel<String> entityMetamodel, String pattern) {
36+
context.add(
37+
(b) -> {
38+
b.appendExpression(entityMetamodel);
39+
b.appendSql(" = ");
40+
b.appendParameter(entityMetamodel, pattern);
41+
});
42+
}
3543
}

doma-core/src/test/java/org/seasar/doma/jdbc/criteria/QueryDslSqlSelectTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1895,6 +1895,25 @@ void extension_or_and() {
18951895
sql.getFormattedSql());
18961896
}
18971897

1898+
@Test
1899+
void extension_null() {
1900+
var e = new Emp_();
1901+
var stmt =
1902+
dsl.from(e)
1903+
.where(
1904+
c -> {
1905+
c.extension(
1906+
MyExtension::new,
1907+
(ext) -> {
1908+
ext.eq2(e.name, null);
1909+
});
1910+
})
1911+
.select(e.id);
1912+
1913+
var sql = stmt.asSql();
1914+
assertEquals("select t0_.ID from EMP t0_ where t0_.NAME = null", sql.getFormattedSql());
1915+
}
1916+
18981917
private static UserDefinedExpression<Long> countDistinctMultiple(
18991918
PropertyMetamodel<?>... propertyMetamodels) {
19001919
return userDefined(

doma-kotlin/src/main/kotlin/org/seasar/doma/kotlin/jdbc/criteria/declaration/KComparisonDeclaration.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ abstract class KComparisonDeclaration<DECLARATION : org.seasar.doma.jdbc.criteri
115115
override fun cutBackSql(length: Int) = builder.cutBackSql(length)
116116
override fun appendExpression(propertyMetamodel: PropertyMetamodel<*>) =
117117
builder.appendExpression(propertyMetamodel)
118+
override fun <PROPERTY> appendParameter(left: PropertyMetamodel<PROPERTY>, right: PROPERTY?) =
119+
builder.appendParameter(left, right)
118120
override val dialect: Dialect
119121
get() = builder.dialect
120122
})

doma-kotlin/src/main/kotlin/org/seasar/doma/kotlin/jdbc/criteria/declaration/KUserDefinedCriteriaContext.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ fun interface KUserDefinedCriteriaContext {
2828

2929
fun appendExpression(propertyMetamodel: PropertyMetamodel<*>)
3030

31+
fun <PROPERTY> appendParameter(left: PropertyMetamodel<PROPERTY>, right: PROPERTY?)
32+
3133
val dialect: Dialect
3234
}
3335
}

doma-kotlin/src/test/kotlin/org/seasar/doma/jdbc/criteria/KQueryDslSqlSelectTest.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,24 @@ internal class KQueryDslSqlSelectTest {
707707
)
708708
}
709709

710+
@Test
711+
fun where_null() {
712+
val e = Emp_()
713+
val stmt = dsl
714+
.from(e)
715+
.where {
716+
extension(::MyExtension) {
717+
eq2(e.name, null)
718+
}
719+
}
720+
.select(e.id)
721+
val sql = stmt.asSql()
722+
assertEquals(
723+
"select t0_.ID from EMP t0_ where t0_.NAME = null",
724+
sql.formattedSql,
725+
)
726+
}
727+
710728
@Test
711729
fun innerJoin() {
712730
val e = Emp_()

doma-kotlin/src/test/kotlin/org/seasar/doma/jdbc/criteria/MyExtension.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,26 @@ package org.seasar.doma.jdbc.criteria
1717

1818
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel
1919
import org.seasar.doma.kotlin.jdbc.criteria.declaration.KUserDefinedCriteriaContext
20-
import org.seasar.doma.kotlin.jdbc.criteria.expression.KExpressions
2120

2221
data class MyExtension(val context: KUserDefinedCriteriaContext) {
23-
fun likeMultiple(entityMetamodel: PropertyMetamodel<*>, vararg patterns: String) {
22+
fun likeMultiple(propertyMetamodel: PropertyMetamodel<String>, vararg patterns: String) {
2423
context.add {
2524
patterns.forEach { pattern ->
26-
appendExpression(entityMetamodel)
25+
appendExpression(propertyMetamodel)
2726
appendSql(" like ")
28-
appendExpression(KExpressions.literal("%" + pattern + "%"))
27+
appendParameter(propertyMetamodel, "%$pattern%")
2928
appendSql(" escape '\\'")
3029
appendSql(" and ")
3130
}
3231
cutBackSql(5)
3332
}
3433
}
34+
35+
fun eq2(entityMetamodel: PropertyMetamodel<String?>, pattern: String?) {
36+
context.add {
37+
appendExpression(entityMetamodel)
38+
appendSql(" = ")
39+
appendParameter(entityMetamodel, pattern)
40+
}
41+
}
3542
}

integration-test-java/src/test/java/org/seasar/doma/it/criteria/MyExtension.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,41 @@
1616
package org.seasar.doma.it.criteria;
1717

1818
import org.seasar.doma.jdbc.criteria.declaration.UserDefinedCriteriaContext;
19-
import org.seasar.doma.jdbc.criteria.expression.Expressions;
2019
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
2120

2221
record MyExtension(UserDefinedCriteriaContext context) {
23-
public void regexp(PropertyMetamodel<?> entityMetamodel, String regexp) {
22+
public void regexp(PropertyMetamodel<String> entityMetamodel, String regexp) {
2423
context.add(
2524
(b) -> {
2625
var dialectName = b.getDialect().getName();
2726
if (dialectName.startsWith("mysql")) {
2827
b.appendExpression(entityMetamodel);
2928
b.appendSql(" regexp ");
30-
b.appendExpression(Expressions.literal(regexp));
29+
b.appendParameter(entityMetamodel, regexp);
3130
} else if (dialectName.equals("postgres")) {
3231
b.appendExpression(entityMetamodel);
3332
b.appendSql(" ~ ");
34-
b.appendExpression(Expressions.literal(regexp));
33+
b.appendParameter(entityMetamodel, regexp);
3534
} else if (dialectName.equals("oracle")) {
3635
b.appendSql("regexp_like(");
3736
b.appendExpression(entityMetamodel);
3837
b.appendSql(",");
39-
b.appendExpression(Expressions.literal(regexp));
38+
b.appendParameter(entityMetamodel, regexp);
4039
b.appendSql(")");
4140
} else {
4241
b.appendExpression(entityMetamodel);
4342
b.appendSql(" like ");
44-
b.appendExpression(Expressions.literal("%" + regexp + "%"));
43+
b.appendParameter(entityMetamodel, "%" + regexp + "%");
4544
}
4645
});
4746
}
47+
48+
public void eq2(PropertyMetamodel<String> entityMetamodel, String pattern) {
49+
context.add(
50+
(b) -> {
51+
b.appendExpression(entityMetamodel);
52+
b.appendSql(" = ");
53+
b.appendParameter(entityMetamodel, pattern);
54+
});
55+
}
4856
}

integration-test-java/src/test/java/org/seasar/doma/it/criteria/QueryDslSqlSelectTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,4 +1218,24 @@ void extension_or_and() {
12181218
assertEquals("ACCOUNTING", list.get(0).getDepartmentName());
12191219
assertEquals("SALES", list.get(1).getDepartmentName());
12201220
}
1221+
1222+
@Test
1223+
void extension_null() {
1224+
var d = new Department_();
1225+
var list =
1226+
dsl.from(d)
1227+
.where(
1228+
c -> {
1229+
c.extension(
1230+
MyExtension::new,
1231+
(ext) -> {
1232+
ext.eq2(d.departmentName, null);
1233+
});
1234+
})
1235+
.orderBy(c -> c.asc(d.departmentId))
1236+
.select()
1237+
.fetch();
1238+
1239+
assertEquals(0, list.size());
1240+
}
12211241
}

0 commit comments

Comments
 (0)