Skip to content

Commit 173ad6b

Browse files
authored
Merge pull request #904 from jeffgbutler/select-enhancements
Add Support for Various Locking Functions in Select Statements
2 parents a645046 + 2a1b8da commit 173ad6b

File tree

22 files changed

+817
-216
lines changed

22 files changed

+817
-216
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ Runtime behavior changes:
9696
rendering if a null value is passed in
9797
- The JOIN syntax is updated and now allows full boolean expressions like a WHERE clause. The prior JOIN syntax
9898
is deprecated and will be removed in a future release.
99+
- Add support for locking options in select statements (for update, for share, etc.) This is not an abstraction of
100+
these concepts for different databases it simply adds known clauses to a generated SQL statement. You should always
101+
test to make sure these functions work in your target database. Currently, we support, and test, the options
102+
supported by PostgreSQL.
99103

100104
## Release 1.5.2 - June 3, 2024
101105

src/main/java/org/mybatis/dynamic/sql/select/AbstractHavingStarter.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525
import org.mybatis.dynamic.sql.SqlCriterion;
2626
import org.mybatis.dynamic.sql.VisitableCondition;
2727

28-
public abstract class AbstractHavingStarter<F extends AbstractHavingFinisher<?>> {
28+
public interface AbstractHavingStarter<F extends AbstractHavingFinisher<?>> {
2929

30-
public <T> F having(BindableColumn<T> column, VisitableCondition<T> condition,
30+
default <T> F having(BindableColumn<T> column, VisitableCondition<T> condition,
3131
AndOrCriteriaGroup... subCriteria) {
3232
return having(column, condition, Arrays.asList(subCriteria));
3333
}
3434

35-
public <T> F having(BindableColumn<T> column, VisitableCondition<T> condition,
35+
default <T> F having(BindableColumn<T> column, VisitableCondition<T> condition,
3636
List<AndOrCriteriaGroup> subCriteria) {
3737
SqlCriterion sqlCriterion = ColumnAndConditionCriterion.withColumn(column)
3838
.withCondition(condition)
@@ -42,11 +42,11 @@ public <T> F having(BindableColumn<T> column, VisitableCondition<T> condition,
4242
return initialize(sqlCriterion);
4343
}
4444

45-
public F having(SqlCriterion initialCriterion, AndOrCriteriaGroup... subCriteria) {
45+
default F having(SqlCriterion initialCriterion, AndOrCriteriaGroup... subCriteria) {
4646
return having(initialCriterion, Arrays.asList(subCriteria));
4747
}
4848

49-
public F having(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
49+
default F having(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
5050
SqlCriterion sqlCriterion = new CriteriaGroup.Builder()
5151
.withInitialCriterion(initialCriterion)
5252
.withSubCriteria(subCriteria)
@@ -55,9 +55,9 @@ public F having(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCrite
5555
return initialize(sqlCriterion);
5656
}
5757

58-
protected abstract F having();
58+
F having();
5959

60-
public F applyHaving(HavingApplier havingApplier) {
60+
default F applyHaving(HavingApplier havingApplier) {
6161
F finisher = having();
6262
havingApplier.accept(finisher);
6363
return finisher;

src/main/java/org/mybatis/dynamic/sql/select/HavingDSL.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717

1818
import org.mybatis.dynamic.sql.util.Buildable;
1919

20-
public class HavingDSL extends AbstractHavingStarter<HavingDSL.StandaloneHavingFinisher> {
20+
public class HavingDSL implements AbstractHavingStarter<HavingDSL.StandaloneHavingFinisher> {
2121
private final StandaloneHavingFinisher havingFinisher = new StandaloneHavingFinisher();
2222

2323
@Override
24-
protected StandaloneHavingFinisher having() {
24+
public StandaloneHavingFinisher having() {
2525
return havingFinisher;
2626
}
2727

src/main/java/org/mybatis/dynamic/sql/select/MultiSelectDSL.java

+43-20
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@
2929
import org.mybatis.dynamic.sql.util.Buildable;
3030
import org.mybatis.dynamic.sql.util.ConfigurableStatement;
3131

32-
public class MultiSelectDSL implements Buildable<MultiSelectModel>, ConfigurableStatement<MultiSelectDSL>,
33-
PagingDSL<MultiSelectModel> {
32+
public class MultiSelectDSL implements Buildable<MultiSelectModel>, ConfigurableStatement<MultiSelectDSL> {
3433
private final List<UnionQuery> unionQueries = new ArrayList<>();
3534
private final SelectModel initialSelect;
3635
private @Nullable OrderByModel orderByModel;
@@ -62,22 +61,31 @@ public MultiSelectDSL orderBy(Collection<? extends SortSpecification> columns) {
6261
return this;
6362
}
6463

65-
@Override
66-
public LimitFinisher<MultiSelectModel> limitWhenPresent(@Nullable Long limit) {
64+
public LimitFinisher limit(long limit) {
65+
return limitWhenPresent(limit);
66+
}
67+
68+
public LimitFinisher limitWhenPresent(@Nullable Long limit) {
6769
this.limit = limit;
68-
return new LocalLimitFinisher();
70+
return new LimitFinisher();
6971
}
7072

71-
@Override
72-
public OffsetFirstFinisher<MultiSelectModel> offsetWhenPresent(@Nullable Long offset) {
73+
public OffsetFirstFinisher offset(long offset) {
74+
return offsetWhenPresent(offset);
75+
}
76+
77+
public OffsetFirstFinisher offsetWhenPresent(@Nullable Long offset) {
7378
this.offset = offset;
74-
return new LocalOffsetFirstFinisher();
79+
return new OffsetFirstFinisher();
7580
}
7681

77-
@Override
78-
public FetchFirstFinisher<MultiSelectModel> fetchFirstWhenPresent(@Nullable Long fetchFirstRows) {
82+
public FetchFirstFinisher fetchFirst(long fetchFirstRows) {
83+
return fetchFirstWhenPresent(fetchFirstRows);
84+
}
85+
86+
public FetchFirstFinisher fetchFirstWhenPresent(@Nullable Long fetchFirstRows) {
7987
this.fetchFirstRows = fetchFirstRows;
80-
return () -> this;
88+
return new FetchFirstFinisher();
8189
}
8290

8391
@Override
@@ -105,25 +113,40 @@ public MultiSelectDSL configureStatement(Consumer<StatementConfiguration> consum
105113
return this;
106114
}
107115

108-
abstract class BaseBuildable implements Buildable<MultiSelectModel> {
116+
public class OffsetFirstFinisher implements Buildable<MultiSelectModel> {
117+
public FetchFirstFinisher fetchFirst(long fetchFirstRows) {
118+
return fetchFirstWhenPresent(fetchFirstRows);
119+
}
120+
121+
public FetchFirstFinisher fetchFirstWhenPresent(@Nullable Long fetchFirstRows) {
122+
MultiSelectDSL.this.fetchFirstRows = fetchFirstRows;
123+
return new FetchFirstFinisher();
124+
}
125+
109126
@Override
110127
public MultiSelectModel build() {
111128
return MultiSelectDSL.this.build();
112129
}
113130
}
114131

115-
class LocalOffsetFirstFinisher extends BaseBuildable implements OffsetFirstFinisher<MultiSelectModel> {
132+
public class LimitFinisher implements Buildable<MultiSelectModel> {
133+
public MultiSelectDSL offset(long offset) {
134+
return offsetWhenPresent(offset);
135+
}
136+
137+
public MultiSelectDSL offsetWhenPresent(@Nullable Long offset) {
138+
MultiSelectDSL.this.offset = offset;
139+
return MultiSelectDSL.this;
140+
}
141+
116142
@Override
117-
public FetchFirstFinisher<MultiSelectModel> fetchFirstWhenPresent(Long fetchFirstRows) {
118-
MultiSelectDSL.this.fetchFirstRows = fetchFirstRows;
119-
return () -> MultiSelectDSL.this;
143+
public MultiSelectModel build() {
144+
return MultiSelectDSL.this.build();
120145
}
121146
}
122147

123-
class LocalLimitFinisher extends BaseBuildable implements LimitFinisher<MultiSelectModel> {
124-
@Override
125-
public Buildable<MultiSelectModel> offsetWhenPresent(Long offset) {
126-
MultiSelectDSL.this.offset = offset;
148+
public class FetchFirstFinisher {
149+
public MultiSelectDSL rowsOnly() {
127150
return MultiSelectDSL.this;
128151
}
129152
}

src/main/java/org/mybatis/dynamic/sql/select/PagingDSL.java

-59
This file was deleted.

0 commit comments

Comments
 (0)