Skip to content

Commit 910574c

Browse files
authored
Merge pull request #395 from domaframework/improve-criteria-api
Improve the Criteria API
2 parents 50cea17 + b062f87 commit 910574c

File tree

14 files changed

+79
-71
lines changed

14 files changed

+79
-71
lines changed

docs/criteria-api.rst

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,27 @@ The above query issues the following SQL statement:
654654
Tips
655655
====
656656

657+
Execution in Dao (Entityql, NativeSql)
658+
--------------------------------------
659+
660+
It is useful to execute DSLs in the default method of the Dao interface.
661+
To get a ``config`` object, call ``Config.get(this)`` in the default method as follows:
662+
663+
.. code-block:: java
664+
665+
@Dao
666+
public interface EmployeeDao {
667+
668+
default Optional<Employee> selectById(Integer id) {
669+
Employee_ e = new Employee_();
670+
List<Employee> list =
671+
Entityql.from(e)
672+
.where(c -> c.eq(e.employeeId, id))
673+
.execute(Config.get(this));
674+
return list.stream().findFirst();
675+
}
676+
}
677+
657678
The use of the select method (NativeSql)
658679
----------------------------------------
659680

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/MappedObjectProvider.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
import java.util.Map;
88
import java.util.Objects;
99
import java.util.function.Function;
10+
import org.seasar.doma.DomaException;
1011
import org.seasar.doma.internal.jdbc.command.AbstractObjectProvider;
1112
import org.seasar.doma.jdbc.JdbcMappingVisitor;
1213
import org.seasar.doma.jdbc.criteria.def.PropertyDef;
1314
import org.seasar.doma.jdbc.criteria.statement.Row;
1415
import org.seasar.doma.jdbc.entity.Property;
1516
import org.seasar.doma.jdbc.query.Query;
17+
import org.seasar.doma.message.Message;
1618

1719
public class MappedObjectProvider<RESULT> extends AbstractObjectProvider<RESULT> {
1820
private final Function<Row, RESULT> mapper;
@@ -42,8 +44,7 @@ public RESULT get(ResultSet resultSet) throws SQLException {
4244
public <PROPERTY> PROPERTY get(PropertyDef<PROPERTY> propertyDef) {
4345
Integer index = indexMap.get(propertyDef);
4446
if (index == null) {
45-
throw new IllegalArgumentException(
46-
"The propertyDef is unknown. " + propertyDef.getName());
47+
throw new DomaException(Message.DOMA6002, propertyDef.getName());
4748
}
4849
Property<?, ?> property = propertyDef.asType().createProperty();
4950
try {

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

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ public String getName() {
3636
return name;
3737
}
3838

39+
@Override
40+
public Class<?> asClass() {
41+
return argument.asClass();
42+
}
43+
3944
@Override
4045
public EntityPropertyType<?, ?> asType() {
4146
return argument.asType();
@@ -62,16 +67,8 @@ public int hashCode() {
6267

6368
class Avg<PROPERTY> extends AbstractFunction<PROPERTY> {
6469

65-
private final PropertyDef<PROPERTY> argument;
66-
6770
public Avg(PropertyDef<PROPERTY> argument) {
6871
super("avg", argument);
69-
this.argument = argument;
70-
}
71-
72-
@Override
73-
public Class<PROPERTY> asClass() {
74-
return argument.asClass();
7572
}
7673
}
7774

@@ -83,7 +80,7 @@ public Count(PropertyDef<?> argument) {
8380
}
8481

8582
@Override
86-
public Class<Long> asClass() {
83+
public Class<?> asClass() {
8784
return Long.class;
8885
}
8986

@@ -94,44 +91,22 @@ public EntityPropertyType<?, Long> asType() {
9491
}
9592

9693
class Max<PROPERTY> extends AbstractFunction<PROPERTY> {
97-
private final PropertyDef<PROPERTY> argument;
9894

9995
public Max(PropertyDef<PROPERTY> argument) {
10096
super("max", argument);
101-
this.argument = argument;
102-
}
103-
104-
@Override
105-
public Class<PROPERTY> asClass() {
106-
return argument.asClass();
10797
}
10898
}
10999

110100
class Min<PROPERTY> extends AbstractFunction<PROPERTY> {
111-
private final PropertyDef<PROPERTY> argument;
112101

113102
public Min(PropertyDef<PROPERTY> argument) {
114103
super("min", argument);
115-
this.argument = argument;
116-
}
117-
118-
@Override
119-
public Class<PROPERTY> asClass() {
120-
return argument.asClass();
121104
}
122105
}
123106

124107
class Sum<PROPERTY> extends AbstractFunction<PROPERTY> {
125-
private final PropertyDef<PROPERTY> argument;
126-
127108
public Sum(PropertyDef<PROPERTY> argument) {
128109
super("sum", argument);
129-
this.argument = argument;
130-
}
131-
132-
@Override
133-
public Class<PROPERTY> asClass() {
134-
return argument.asClass();
135110
}
136111
}
137112

@@ -146,7 +121,7 @@ public String getName() {
146121
}
147122

148123
@Override
149-
public Class<Long> asClass() {
124+
public Class<?> asClass() {
150125
return Long.class;
151126
}
152127

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.function.BiConsumer;
66
import java.util.function.Consumer;
77
import java.util.function.Function;
8+
import org.seasar.doma.DomaException;
89
import org.seasar.doma.internal.util.Pair;
910
import org.seasar.doma.jdbc.criteria.context.ForUpdate;
1011
import org.seasar.doma.jdbc.criteria.context.Join;
@@ -14,6 +15,7 @@
1415
import org.seasar.doma.jdbc.criteria.def.EntityDef;
1516
import org.seasar.doma.jdbc.criteria.def.PropertyDef;
1617
import org.seasar.doma.jdbc.criteria.statement.Row;
18+
import org.seasar.doma.message.Message;
1719

1820
public class SelectFromDeclaration {
1921

@@ -106,12 +108,10 @@ public <ENTITY1, ENTITY2> void associate(
106108
Objects.requireNonNull(second);
107109
Objects.requireNonNull(associator);
108110
if (!context.getEntityDefs().contains(first)) {
109-
throw new IllegalStateException(
110-
"The first is unknown. Ensure that you have added its constructor to the from function or the join functions.");
111+
throw new DomaException(Message.DOMA6001, "first");
111112
}
112113
if (!context.getEntityDefs().contains(second)) {
113-
throw new IllegalStateException(
114-
"The second is unknown. Ensure that you have added its constructor to the from function or the join functions.");
114+
throw new DomaException(Message.DOMA6001, "second");
115115
}
116116
//noinspection unchecked
117117
context.associations.put(new Pair<>(first, second), (BiConsumer<Object, Object>) associator);

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/DefaultPropertyDef.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@
55

66
public class DefaultPropertyDef<PROPERTY> implements PropertyDef<PROPERTY> {
77

8-
private final Class<PROPERTY> clazz;
8+
private final Class<?> clazz;
99
private final EntityType<?> entityType;
1010
private final String name;
1111

12-
public DefaultPropertyDef(Class<PROPERTY> clazz, EntityType<?> entityType, String name) {
12+
public DefaultPropertyDef(Class<?> clazz, EntityType<?> entityType, String name) {
1313
this.clazz = clazz;
1414
this.entityType = entityType;
1515
this.name = name;
1616
}
1717

1818
@Override
19-
public Class<PROPERTY> asClass() {
19+
public Class<?> asClass() {
2020
return clazz;
2121
}
2222

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/PropertyDef.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
public interface PropertyDef<PROPERTY> {
66

7-
Class<PROPERTY> asClass();
7+
Class<?> asClass();
88

99
EntityPropertyType<?, ?> asType();
1010

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.Objects;
55
import java.util.function.Consumer;
66
import java.util.function.Function;
7+
import org.seasar.doma.DomaException;
78
import org.seasar.doma.internal.jdbc.sql.PreparedSqlBuilder;
89
import org.seasar.doma.jdbc.Config;
910
import org.seasar.doma.jdbc.InParameter;
@@ -16,6 +17,7 @@
1617
import org.seasar.doma.jdbc.criteria.def.PropertyDef;
1718
import org.seasar.doma.jdbc.entity.EntityPropertyType;
1819
import org.seasar.doma.jdbc.entity.EntityType;
20+
import org.seasar.doma.message.Message;
1921

2022
public class BuilderSupport {
2123
private final Config config;
@@ -46,7 +48,7 @@ public void table(EntityDef<?> entityDef) {
4648
buf.appendSql(" ");
4749
String alias = aliasManager.getAlias(entityDef);
4850
if (alias == null) {
49-
throw new IllegalStateException("The alias is not found. " + entityType.getName());
51+
throw new DomaException(Message.DOMA6003, entityType.getName());
5052
}
5153
buf.appendSql(alias);
5254
}
@@ -65,7 +67,7 @@ public void column(PropertyDef<?> propertyDef) {
6567
if (aliasManager != null) {
6668
String alias = aliasManager.getAlias(p);
6769
if (alias == null) {
68-
throw new IllegalStateException("The alias is not found. " + p.getName());
70+
throw new DomaException(Message.DOMA6004, p.getName());
6971
}
7072
buf.appendSql(alias);
7173
buf.appendSql(".");

doma-core/src/main/java/org/seasar/doma/message/Message.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,6 +923,14 @@ public enum Message implements MessageResource {
923923
+ "If the JDBC driver is not loaded automatically, load it explicitly using Class.forName. "
924924
+ "ex) Class.forName(\"oracle.jdbc.driver.OracleDriver\")"),
925925
DOMA5002("The url property is not specified."),
926+
927+
// criteria
928+
DOMA6001(
929+
"The parameter \"{0}\" is unknown. Ensure that you have passed it to the \"from\" method or the \"join\" method."),
930+
DOMA6002(
931+
"The propertyDef \"{0}\" is unknown. Ensure that you have passed it to the \"select\" method."),
932+
DOMA6003("The table alias is not found for the entityDef \"{0}\"."),
933+
DOMA6004("The column alias is not found for the propertyDef \"{0}\"."),
926934
;
927935

928936
private final String messagePattern;

doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableDefGenerator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,11 @@ private void printConstructor() {
8989
for (EmbeddablePropertyMeta p : embeddableMeta.getEmbeddablePropertyMetas()) {
9090
Pair<CtType, TypeMirror> pair = p.getCtType().accept(visitor, null);
9191
iprint(
92-
"this.%1$s = new %2$s<>(%3$s.class, entityType, name + \".%1$s\");%n",
92+
"this.%1$s = new %2$s<%3$s>(%4$s.class, entityType, name + \".%1$s\");%n",
9393
/* 1 */ p.getName(),
9494
/* 2 */ DefaultPropertyDef.class,
95-
/* 3 */ pair.fst.getQualifiedName());
95+
/* 3 */ pair.snd,
96+
/* 4 */ pair.fst.getQualifiedName());
9697
}
9798
iprint(
9899
"java.util.List<%1$s<?>> __list = new java.util.ArrayList<>(%2$s);%n",

doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityDefGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ private void printPropertyDefFields() {
109109
} else {
110110
Pair<CtType, TypeMirror> pair = p.getCtType().accept(visitor, null);
111111
iprint(
112-
"public final %1$s<%2$s> %3$s = new %4$s<>(%5$s.class, __entityType, \"%3$s\");%n",
112+
"public final %1$s<%2$s> %3$s = new %4$s<%2$s>(%5$s.class, __entityType, \"%3$s\");%n",
113113
/* 1 */ PropertyDef.class,
114114
/* 2 */ pair.snd,
115115
/* 3 */ p.getName(),

0 commit comments

Comments
 (0)