mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
Merge pull request #2996 from ebean-orm/buchtajz-query_select_bugs
Add support for specifying select clause with RawSql
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
package org.tests.rawsql;
|
||||
|
||||
import io.ebean.*;
|
||||
import io.ebean.xtest.BaseTestCase;
|
||||
import io.ebean.xtest.IgnorePlatform;
|
||||
import io.ebean.annotation.Platform;
|
||||
import io.ebean.test.LoggedSql;
|
||||
import io.ebean.xtest.BaseTestCase;
|
||||
import io.ebean.xtest.IgnorePlatform;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.tests.model.basic.Customer;
|
||||
import org.tests.model.basic.Order;
|
||||
@@ -21,7 +21,6 @@ public class TestRawSqlOrmQuery extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
RawSql rawSql = RawSqlBuilder.parse("select r.id, r.name from o_customer r ")
|
||||
@@ -42,10 +41,37 @@ public class TestRawSqlOrmQuery extends BaseTestCase {
|
||||
LoggedSql.start();
|
||||
assertThat(query.findCount()).isEqualTo(list.size());
|
||||
List<String>sql = LoggedSql.stop();
|
||||
assertThat(sql.get(0)).startsWith("select count(*) from ( select r.id, r.name from o_customer r");
|
||||
assertThat(sql.get(0)).startsWith("select count(*) from ( select r.id from o_customer r");
|
||||
assertThat(sql.get(0)).doesNotContain("order by");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindCount_when_idPropertyNotMapped() {
|
||||
ResetBasicData.reset();
|
||||
|
||||
// mapping does not include the id column & property
|
||||
RawSql rawSql = RawSqlBuilder.parse("select r.name, r.status from o_customer r ")
|
||||
.columnMapping("r.name", "name")
|
||||
.columnMapping("r.status", "status")
|
||||
.create();
|
||||
|
||||
Query<Customer> query = DB.find(Customer.class);
|
||||
query.setRawSql(rawSql);
|
||||
query.where().ilike("name", "r%").orderBy("name");
|
||||
|
||||
LoggedSql.start();
|
||||
List<Customer> list = query.findList();
|
||||
assertNotNull(list);
|
||||
|
||||
// check also select count(*)
|
||||
assertThat(query.findCount()).isEqualTo(list.size());
|
||||
List<String>sql = LoggedSql.stop();
|
||||
assertThat(sql.get(0)).startsWith("select r.name, r.status from o_customer r where lower(r.name) like ?");
|
||||
assertThat(sql.get(0)).contains(" order by r.name");
|
||||
assertThat(sql.get(1)).startsWith("select count(*) from ( select r.name, r.status from o_customer r where lower(r.name) like ?");
|
||||
assertThat(sql.get(1)).doesNotContain("order by");
|
||||
}
|
||||
|
||||
@Test
|
||||
@IgnorePlatform({Platform.MYSQL, Platform.MARIADB, Platform.SQLSERVER})
|
||||
public void test_upperCaseSql() {
|
||||
@@ -158,7 +184,7 @@ public class TestRawSqlOrmQuery extends BaseTestCase {
|
||||
LoggedSql.start();
|
||||
query.findCount();
|
||||
List<String>sql = LoggedSql.stop();
|
||||
assertThat(sql.get(0)).startsWith("select count(*) from ( select o.id, o.order_date, o.ship_date from o_order o");
|
||||
assertThat(sql.get(0)).startsWith("select count(*) from ( select o.id from o_order o");
|
||||
assertThat(sql.get(0)).doesNotContain("order by");
|
||||
}
|
||||
|
||||
@@ -193,7 +219,7 @@ public class TestRawSqlOrmQuery extends BaseTestCase {
|
||||
LoggedSql.start();
|
||||
query.findCount();
|
||||
List<String>sql = LoggedSql.stop();
|
||||
assertThat(sql.get(0)).startsWith("select count(*) from ( select o.id, o.order_date, o.ship_date from o_order o");
|
||||
assertThat(sql.get(0)).startsWith("select count(*) from ( select o.id from o_order o");
|
||||
assertThat(sql.get(0)).doesNotContain("order by");
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package org.tests.rawsql;
|
||||
|
||||
import io.ebean.DB;
|
||||
import io.ebean.FetchGroup;
|
||||
import io.ebean.RawSql;
|
||||
import io.ebean.RawSqlBuilder;
|
||||
import io.ebean.xtest.BaseTestCase;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.tests.model.basic.ResetBasicData;
|
||||
import org.tests.rawsql.transport.QuerySumResponse;
|
||||
import org.tests.rawsql.transport.SampleReport;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class TestRawSqlQuerySelect extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void testRawSQL() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
RawSql rawSql = RawSqlBuilder.parse("select id, name, anniversary, city from (select c.id, c.name, c.anniversary, a.city from o_customer c left join o_address a ON a.id = c.billing_address_id order by c.id) w").create();
|
||||
String sumSql = "COUNT(1)::BIGINT AS count, SUM(id)::DOUBLE PRECISION AS sum";
|
||||
|
||||
var query = DB.find(SampleReport.class);
|
||||
query.setRawSql(rawSql);
|
||||
query.setMaxRows(10);
|
||||
List<SampleReport> list = query.findList();
|
||||
Assertions.assertNotNull(list);
|
||||
Assertions.assertTrue(!list.isEmpty() && list.size() < 11);
|
||||
|
||||
var countSum = DB.find(SampleReport.class)
|
||||
.setRawSql(rawSql)
|
||||
//.select(sumSql)
|
||||
.select(FetchGroup.of(SampleReport.class, sumSql))
|
||||
.setMaxRows(10)
|
||||
.asDto(QuerySumResponse.class)
|
||||
.findOne();
|
||||
Assertions.assertInstanceOf(QuerySumResponse.class, countSum);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package org.tests.rawsql.transport;
|
||||
|
||||
public class QuerySumResponse {
|
||||
private long count;
|
||||
private Double sum;
|
||||
|
||||
public QuerySumResponse() {
|
||||
}
|
||||
|
||||
public QuerySumResponse(long count, Double sum) {
|
||||
this.count = count;
|
||||
this.sum = sum;
|
||||
}
|
||||
|
||||
public long getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
public void setCount(long count) {
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
public Double getSum() {
|
||||
return sum;
|
||||
}
|
||||
|
||||
public void setSum(Double sum) {
|
||||
this.sum = sum;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package org.tests.rawsql.transport;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import java.sql.Date;
|
||||
|
||||
@Entity
|
||||
public class SampleReport {
|
||||
Long id;
|
||||
String name;
|
||||
Date anniversary;
|
||||
String city;
|
||||
}
|
||||
Reference in New Issue
Block a user