#2847 - Add support for Sub-query EQ, NE, LT, LE, GT, GE expressions

This commit is contained in:
Rob Bygrave
2022-11-03 00:22:48 +13:00
parent 6f5e144a93
commit 0a61852711
18 changed files with 373 additions and 62 deletions
@@ -4,6 +4,7 @@ import io.ebean.DB;
import io.ebean.FetchGroup;
import io.ebean.Query;
import io.ebean.test.LoggedSql;
import io.ebean.typequery.TQProperty;
import org.example.domain.Customer;
import org.example.domain.Order;
import org.example.domain.OrderDetail;
@@ -217,6 +218,96 @@ public class QOrderTest {
}
@Test
void geSubQuery() {
var subQuery = new QOrder()
.select(StdFunctions.max(QOrder.Alias.orderDate))
.query();
var query = new QCustomer()
.select(QCustomer.Alias.id)
.registered.ge(subQuery)
.query();
query.findList();
assertThat(query.getGeneratedSql()).contains("select t0.id from be_customer t0 where t0.registered >= (select max(t0.order_date) from o_order t0)");
}
@Test
void gtSubQuery() {
var subQuery = new QOrder()
.select("max(orderDate)")
.query();
var query = new QCustomer()
.select(QCustomer.Alias.id)
.registered.gt(subQuery)
.query();
query.findList();
assertThat(query.getGeneratedSql()).contains("select t0.id from be_customer t0 where t0.registered > (select max(t0.order_date) from o_order t0)");
}
@Test
void leSubQuery() {
var subQuery = new QOrder()
.select("max(orderDate)")
.query();
var query = new QCustomer()
.select(QCustomer.Alias.id)
.registered.le(subQuery)
.query();
query.findList();
assertThat(query.getGeneratedSql()).contains("select t0.id from be_customer t0 where t0.registered <= (select max(t0.order_date) from o_order t0)");
}
@Test
void ltSubQuery() {
var subQuery = new QOrder()
.select("max(orderDate)")
.query();
var query = new QCustomer()
.select(QCustomer.Alias.id)
.registered.lt(subQuery)
.query();
query.findList();
assertThat(query.getGeneratedSql()).contains("select t0.id from be_customer t0 where t0.registered < (select max(t0.order_date) from o_order t0)");
}
@Test
void eqSubQuery() {
var subQuery = new QOrder()
.select("max(orderDate)")
.query();
var query = new QCustomer()
.select(QCustomer.Alias.id)
.registered.eq(subQuery)
.query();
query.findList();
assertThat(query.getGeneratedSql()).contains("select t0.id from be_customer t0 where t0.registered = (select max(t0.order_date) from o_order t0)");
}
@Test
void neSubQuery() {
var subQuery = new QOrder()
.select(StdFunctions.max(QOrder.Alias.orderDate))
.query();
var query = new QCustomer()
.select(QCustomer.Alias.id)
.registered.ne(subQuery)
.query();
query.findList();
assertThat(query.getGeneratedSql()).contains("select t0.id from be_customer t0 where t0.registered <> (select max(t0.order_date) from o_order t0)");
}
@Test
void propertyCompare() {
Query<Order> query = new QOrder()
@@ -283,4 +374,10 @@ public class QOrderTest {
order.setCustomer(customer);
order.save();
}
static class StdFunctions {
static String max(TQProperty<?> prop) {
return "max(" + prop + ")";
}
}
}