package jef.orm.onetable;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import jef.common.log.LogUtil;
import jef.database.DbClient;
import jef.database.NativeQuery;
import jef.database.QB;
import jef.database.meta.FBIField;
import jef.database.query.AllTableColumns.AliasMode;
import jef.database.query.Join;
import jef.database.query.Query;
import jef.database.query.RefField;
import jef.database.query.Selects;
import jef.database.test.DataSource;
import jef.database.test.DataSourceContext;
import jef.database.test.DatabaseInit;
import jef.database.test.JefJUnit4DatabaseTestRunner;
import jef.orm.onetable.model.Foo;
import jef.orm.onetable.model.TestEntity;
import jef.script.javascript.Var;
import jef.tools.string.RandomData;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* 测试一些复杂的场景下的行为
*
* @author jiyi
*
*/
@RunWith(JefJUnit4DatabaseTestRunner.class)
@DataSourceContext({
@DataSource(name = "mysql", url = "${mysql.url}", user = "${mysql.user}", password = "${mysql.password}"),
@DataSource(name = "postgresql", url = "${postgresql.url}", user = "${postgresql.user}", password = "${postgresql.password}"),
@DataSource(name = "derby", url = "jdbc:derby:./db;create=true"),
@DataSource(name = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", password = ""),
@DataSource(name = "sqlite", url = "jdbc:sqlite:test.db?date_string_format=yyyy-MM-dd HH:mm:ss"),
@DataSource(name = "oracle", url = "${oracle.url}", user = "${oracle.user}", password = "${oracle.password}"),
@DataSource(name = "sqlserver", url = "${sqlserver.url}",user="${sqlserver.user}",password="${sqlserver.password}")
})
public class ComplexQuerysTest {
private DbClient db;
@DatabaseInit
public void init() {
try {
db.dropTable(TestEntity.class, Foo.class);
db.createTable(TestEntity.class, Foo.class);
} catch (Exception e) {
LogUtil.exception(e);
}
}
/**
* 使用SQL表达式作为 Join的On条件的场景
*
* @throws SQLException
*/
@Test
public void testCase4() throws SQLException {
Query<TestEntity> t1 = QB.create(TestEntity.class);
Query<Foo> t2 = QB.create(Foo.class);
Join join = QB.leftJoin(t1, t2, QB.on(new FBIField("upper($1.field1)", t1), Foo.Field.name));
List<Var> vars = db.selectAs(join, Var.class);
LogUtil.show(vars);
}
/**
* 当自表关联时的Join语句的中的Join Key如何解析的问题
*
* @throws SQLException
*/
@Test
public void testCase2() throws SQLException {
Query<TestEntity> t1 = QB.create(TestEntity.class);
Query<TestEntity> t2 = QB.create(TestEntity.class);
Query<TestEntity> t3 = QB.create(TestEntity.class);
// ///////////可能1 左右都不指定field所属的查询表,自动匹配
// Join join=QB.innerJoin(t1, t2, QB.on(TestEntity.Field.intField2,
// TestEntity.Field.intFiled)); // JOIN test_entity T2 ON T1.intField2 =
// T2.intFiled
// join= QB.leftJoin(join, t3, QB.on(TestEntity.Field.field1,
// TestEntity.Field.field2)); // LEFT JOIN test_entity T3 ON T1.field_1
// = T3.field_2
// /////////可能2 仅有左边指定了field所属的查询表,自动匹配(乱了)
// Join join=QB.leftJoin(t1,t2, QB.on(new
// RefField(t2,TestEntity.Field.intField2),
// TestEntity.Field.intFiled));//JOIN test_entity T2 ON T2.intField2 =
// T2.intFiled
// join= QB.leftJoin(join, t3, QB.on(TestEntity.Field.field1,
// TestEntity.Field.field2)); //LEFT JOIN test_entity T3 ON T1.field_1 =
// T3.field_2
// ////////可能3, 两边都指定了field所属的查询表。
Join join = QB.leftJoin(t1, t2, QB.on(t2, TestEntity.Field.intField2, t1, TestEntity.Field.intFiled));// JOIN
// test_entity
// T2
// ON
// T2.intField2
// =
// T2.intFiled
join = QB.leftJoin(join, t3, QB.on(TestEntity.Field.field1, TestEntity.Field.field2)); // LEFT
// JOIN
// test_entity
// T3
// ON
// T1.field_1
// =
// T3.field_2
List<Var> vars = db.selectAs(join, Var.class);
LogUtil.show(vars);
}
/**
* 表A关联到B,B在以另一个关系关联到A的场景
*
* @throws SQLException
*/
@Test
public void testCase3() throws SQLException {
Query<TestEntity> t1 = QB.create(TestEntity.class);
Query<Foo> t2 = QB.create(Foo.class);
Query<TestEntity> t3 = QB.create(TestEntity.class);
Join join = QB.leftJoin(t1, t2, QB.on(new RefField(t2, Foo.Field.id), TestEntity.Field.intFiled));
join = QB.leftJoin(join, t3, QB.on(TestEntity.Field.field1, TestEntity.Field.field2));
List<Var> vars = db.selectAs(join, Var.class);
LogUtil.show(vars);
}
/**
* 根据API,使用随机数作为列别名的场景
*
* @throws SQLException
*/
@Test
public void testCase5() throws SQLException {
TestEntity[] data = RandomData.newArrayInstance(TestEntity.class, 4);
db.batchInsert(Arrays.asList(data));
Query<TestEntity> t1 = QB.create(TestEntity.class);
Selects select = QB.selectFrom(t1);
select.allColumns(t1).setAliasType(AliasMode.RANDOM);
List<TestEntity> l = db.select(t1);
System.out.println(l.get(0).getField2());
LogUtil.show(l);
List<TestEntity> l2 = db.select(t1);
}
@Test
public void testUnionSQL() throws SQLException{
NativeQuery<Foo> q=db.createNativeQuery("select id,name from foo union all select id,name from foo order by id",Foo.class);
q.setRange(5,5);
q.getResultList();
}
}