Skip to content

Commit 2fe2174

Browse files
authored
Fix invalid delete statement (#539)
1 parent 26c9fc8 commit 2fe2174

File tree

6 files changed

+61
-2
lines changed

6 files changed

+61
-2
lines changed

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,22 @@ public void table(EntityMetamodel<?> entityMetamodel) {
5858
entityType.getQualifiedTableName(
5959
config.getNaming()::apply, config.getDialect()::applyQuote));
6060
buf.appendSql(" ");
61+
String alias = getAlias(entityMetamodel);
62+
buf.appendSql(alias);
63+
}
64+
65+
public void alias(EntityMetamodel<?> entityMetamodel) {
66+
String alias = getAlias(entityMetamodel);
67+
buf.appendSql(alias);
68+
}
69+
70+
public String getAlias(EntityMetamodel<?> entityMetamodel) {
71+
EntityType<?> entityType = entityMetamodel.asType();
6172
String alias = aliasManager.getAlias(entityMetamodel);
6273
if (alias == null) {
6374
throw new DomaException(Message.DOMA6003, entityType.getName());
6475
}
65-
buf.appendSql(alias);
76+
return alias;
6677
}
6778

6879
public void operand(Operand operand) {

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
1313

1414
public class DeleteBuilder {
15+
private final Config config;
1516
private final DeleteContext context;
1617
private final Function<String, String> commenter;
1718
private final PreparedSqlBuilder buf;
@@ -37,6 +38,7 @@ public DeleteBuilder(
3738
PreparedSqlBuilder buf,
3839
AliasManager aliasManager) {
3940
Objects.requireNonNull(config);
41+
this.config = Objects.requireNonNull(config);
4042
this.context = Objects.requireNonNull(context);
4143
this.commenter = Objects.requireNonNull(commenter);
4244
this.buf = Objects.requireNonNull(buf);
@@ -45,7 +47,12 @@ public DeleteBuilder(
4547
}
4648

4749
public PreparedSql build() {
48-
buf.appendSql("delete from ");
50+
buf.appendSql("delete");
51+
if (config.getDialect().supportsAliasInDeleteClause()) {
52+
buf.appendSql(" ");
53+
alias(context.entityMetamodel);
54+
}
55+
buf.appendSql(" from ");
4956
table(context.entityMetamodel);
5057
if (!context.where.isEmpty()) {
5158
buf.appendSql(" where ");
@@ -59,6 +66,10 @@ public PreparedSql build() {
5966
return buf.build(commenter);
6067
}
6168

69+
private void alias(EntityMetamodel<?> entityMetamodel) {
70+
support.alias(entityMetamodel);
71+
}
72+
6273
private void table(EntityMetamodel<?> entityMetamodel) {
6374
support.table(entityMetamodel);
6475
}

doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Dialect.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,19 @@ public interface Dialect {
123123
*/
124124
boolean supportsIdentityReservation();
125125

126+
/**
127+
* Whether this object supports alias reference in DELETE clause as follows:
128+
*
129+
* <pre>
130+
* DELETE t FROM employee t
131+
* </pre>
132+
*
133+
* @return {@code true}, if this object supports it
134+
*/
135+
default boolean supportsAliasInDeleteClause() {
136+
return false;
137+
}
138+
126139
/**
127140
* Returns an SQL object to get IDENTITY values that are generated in the database.
128141
*

doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Mssql2008Dialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ public boolean supportsAutoGeneratedKeys() {
114114
return true;
115115
}
116116

117+
@Override
118+
public boolean supportsAliasInDeleteClause() {
119+
return true;
120+
}
121+
117122
@Override
118123
public String getScriptBlockDelimiter() {
119124
return "GO";

doma-core/src/main/java/org/seasar/doma/jdbc/dialect/MysqlDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ public boolean supportsSelectForUpdate(SelectForUpdateType type, boolean withTar
9191
return type == SelectForUpdateType.NORMAL && !withTargets;
9292
}
9393

94+
@Override
95+
public boolean supportsAliasInDeleteClause() {
96+
return true;
97+
}
98+
9499
@Override
95100
protected SqlNode toCountCalculatingSqlNode(SqlNode sqlNode) {
96101
MysqlCountCalculatingTransformer transformer = new MysqlCountCalculatingTransformer();

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.seasar.doma.jdbc.criteria.entity.Dept_;
99
import org.seasar.doma.jdbc.criteria.entity.Emp_;
1010
import org.seasar.doma.jdbc.criteria.statement.Statement;
11+
import org.seasar.doma.jdbc.dialect.MysqlDialect;
1112

1213
class NativeSqlDeleteTest {
1314

@@ -22,6 +23,19 @@ void deleteFrom() {
2223
assertEquals("delete from EMP t0_", sql.getFormattedSql());
2324
}
2425

26+
@Test
27+
void aliasInDeleteClause() {
28+
MockConfig config = new MockConfig();
29+
config.dialect = new MysqlDialect();
30+
NativeSql nativeSql = new NativeSql(config);
31+
32+
Emp_ e = new Emp_();
33+
Statement<Integer> stmt = nativeSql.delete(e);
34+
35+
Sql<?> sql = stmt.asSql();
36+
assertEquals("delete t0_ from EMP t0_", sql.getFormattedSql());
37+
}
38+
2539
@Test
2640
void where() {
2741
Emp_ e = new Emp_();

0 commit comments

Comments
 (0)