package jef.orm.onetable;
import java.sql.SQLException;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityExistsException;
import jef.common.log.LogUtil;
import jef.common.wrapper.IntRange;
import jef.database.Condition;
import jef.database.Condition.Operator;
import jef.database.DbClient;
import jef.database.IConditionField.And;
import jef.database.IConditionField.Not;
import jef.database.IConditionField.Or;
import jef.database.NativeQuery;
import jef.database.ORMConfig;
import jef.database.PagingIterator;
import jef.database.QB;
import jef.database.Sequence;
import jef.database.Transaction;
import jef.database.meta.FBIField;
import jef.database.meta.ITableMetadata;
import jef.database.meta.MetaHolder;
import jef.database.query.Func;
import jef.database.query.JpqlExpression;
import jef.database.query.Query;
import jef.database.query.Selects;
import jef.database.support.RDBMS;
import jef.database.test.DataSource;
import jef.database.test.DataSourceContext;
import jef.database.test.DatabaseInit;
import jef.database.test.IgnoreOn;
import jef.database.test.JefJUnit4DatabaseTestRunner;
import jef.database.test.LogListener;
import jef.database.wrapper.ResultIterator;
import jef.database.wrapper.populator.Transformer;
import jef.orm.multitable.model.Person;
import jef.orm.onetable.model.CaAsset;
import jef.orm.onetable.model.Keyword;
import jef.orm.onetable.model.TestEntity;
import jef.orm.onetable.model.TestEntitySon;
import jef.tools.DateUtils;
import jef.tools.ThreadUtils;
import jef.tools.string.RandomData;
import org.easyframe.enterprise.spring.CommonDao;
import org.easyframe.enterprise.spring.CommonDaoImpl;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
@RunWith(JefJUnit4DatabaseTestRunner.class)
@DataSourceContext({
@DataSource(name = "mysql", url = "${mysql.url}", user = "${mysql.user}", password = "${mysql.password}"),
@DataSource(name = "oracle", url = "${oracle.url}", user = "${oracle.user}", password = "${oracle.password}"),
@DataSource(name = "postgresql", url = "${postgresql.url}", user = "${postgresql.user}", password = "${postgresql.password}"),
@DataSource(name = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", password = ""),
@DataSource(name = "derby", url = "jdbc:derby:./db;create=true"),
@DataSource(name = "sqlite", url = "jdbc:sqlite:test.db?date_string_format=yyyy-MM-dd HH:mm:ss"),
@DataSource(name = "sqlserver", url = "${sqlserver.url}", user = "${sqlserver.user}", password = "${sqlserver.password}")
}
)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SimpleTableTest extends org.junit.Assert {
private DbClient db;
@BeforeClass
public static void setUp() {
ORMConfig.getInstance().setSelectTimeout(20);
ORMConfig.getInstance().setUpdateTimeout(20);
ORMConfig.getInstance().setDeleteTimeout(20);
}
@DatabaseInit
public void cleanRecords() {
try {
// 清除缓存,否则测试案例清理不完整
if (db.getProfile(null).getName() == RDBMS.oracle) {
ITableMetadata meta = MetaHolder.getMeta(TestEntity.class);
Sequence holder = db.getSqlTemplate(null).getSequence(meta.getFirstAutoincrementDef());
holder.clear();
meta = MetaHolder.getMeta(CaAsset.class);
holder = db.getSqlTemplate(null).getSequence(meta.getFirstAutoincrementDef());
if (holder != null) {
holder.clear();
}
}
db.dropTable(TestEntity.class, CaAsset.class, Keyword.class); // 删除表
db.createTable(Keyword.class);
db.refreshTable(TestEntity.class); // 创建表
db.refreshTable(CaAsset.class);
CaAsset t1 = new CaAsset();
t1.setNormal("asfc");
t1.setAssetType(1);
db.insert(t1);
ThreadUtils.doSleep(500);
} catch (SQLException e) {
LogUtil.exception(e);
}
}
/**
* 直接用对象构造出最简单的update语句
*
* @throws SQLException
*/
@Test
public void testDirectUpdate() throws SQLException {
long last = insert3Records();
TestEntity e = new TestEntity();
e.setLongField(last);
e.setIntFiled(1);
e.setLongField2(2L);
int count = db.update(e);
assertTrue(count > 0);
}
@Test
public void testRefreshTable() throws SQLException {
db.refreshTable(TestEntity.class);
}
@Test
public void testKeyword() throws SQLException {
db.delete(QB.create(Keyword.class));
Keyword t1 = RandomData.newInstance(Keyword.class);
Keyword t2 = RandomData.newInstance(Keyword.class);
Keyword t3 = RandomData.newInstance(Keyword.class);
Keyword t4 = RandomData.newInstance(Keyword.class);
t1.startUpdate();
t2.startUpdate();
t3.startUpdate();
t4.startUpdate();
db.insert(t1);
db.batchInsert(Arrays.asList(t2, t3, t4));
List<Keyword> result1 = db.selectByField(Keyword.Field.comment, t1.getComment());
LogUtil.show(result1);
List<Keyword> result2 = db.select(QB.create(Keyword.class));
LogUtil.show(result1);
PagingIterator<Keyword> page = db.pageSelect(QB.create(Keyword.class), 3);
ORMConfig.getInstance().setSpecifyAllColumnName(true);
System.out.println(page.getTotal());
System.out.println(page.next());
System.out.println(page.next());
}
/**
* 使用普通方式插入
*
* @throws SQLException
*/
@Test
public void testCase1() throws SQLException {
db.delete(QB.create(TestEntity.class));
TestEntity t1 = RandomData.newInstance(TestEntity.class);
TestEntity t2 = RandomData.newInstance(TestEntity.class);
TestEntity t3 = RandomData.newInstance(TestEntity.class);
TestEntity t4 = RandomData.newInstance(TestEntity.class);
t1.startUpdate();
t2.startUpdate();
t3.startUpdate();
t4.startUpdate();
t1.setDateField(null);
db.insert(t1);
long base = t1.getLongField() - 1;
assertEquals(base + 1L, t1.getLongField());
db.insert(t2);
assertEquals(base + 2L, t2.getLongField());
db.insert(t3);
assertEquals(base + 3L, t3.getLongField());
t4.setField2("field2 of t4");
db.insert(t4);
assertEquals(base + 4L, t4.getLongField());
System.out.println("rowid:" + t1.rowid());
System.out.println("rowid:" + t2.rowid());
System.out.println("rowid:" + t3.rowid());
System.out.println("rowid:" + t4.rowid());
t1 = db.load(t1);
t2 = db.load(t2);
t3 = db.load(t3);
TestEntity t4_ = db.load(t4);
System.out.println("rowid:" + t1.rowid());
System.out.println("rowid:" + t2.rowid());
System.out.println("rowid:" + t3.rowid());
System.out.println("rowid:" + t4_.rowid());
assertNotNull(t1);
assertNotNull(t2);
assertNotNull(t3);
assertNotNull(t4_);
System.out.println(t1.getDateField());
assertNull(t1.getDateField());
assertNotNull(t2.getDateField());
assertEquals("field2 of t4", t4_.getField2());
}
@Test
@IgnoreOn({ "oracle", "mysql", "derby", "hsqldb" })
public void testCaseForPG() throws SQLException {
db.delete(QB.create(TestEntity.class));
CaAsset t1 = RandomData.newInstance(CaAsset.class);
db.insert(t1);
Transaction session = db.startTransaction();
CaAsset t2 = RandomData.newInstance(CaAsset.class);
t2.setAssetId(t1.getAssetId());
try {
session.insert(t2);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("===" + session.getExpressionValue(session.func(Func.current_timestamp).toString(), Object.class));
session.commit(true);
}
/**
* 测试主键冲突抛出的异常。要求主键冲突时,无论是单记录插入,还是多条记录插入,都抛出
* SQLIntegrityConstraintViolationException
*
* @throws SQLException
* @see SQLIntegrityConstraintViolationException
*/
@Test
public void testConstraintViolationException() throws SQLException {
CaAsset obj = db.load(QB.create(CaAsset.class),false);
obj.setAssetId(obj.getAssetId());
Transaction tx = db.startTransaction();
try {
try {
tx.insert(obj);
} catch (SQLIntegrityConstraintViolationException ex) {
System.out.println("Pass1:" + ex.getMessage());
}
try {
CaAsset obj1 = new CaAsset();
obj1.setAcctId(12L);
obj1.setNormal("sfddfdfd");
tx.batchInsert(Arrays.asList(obj, obj1));
} catch (SQLIntegrityConstraintViolationException ex) {
System.out.println("Pass2:" + ex.getMessage());
}
} finally {
tx.close();
}
}
@Test
@IgnoreOn(allButExcept = "oracle")
public void testConstraintViolationException2() throws SQLException {
ORMConfig.getInstance().setManualSequence(true);
CommonDao dao = new CommonDaoImpl(db);
CaAsset obj = db.load(QB.create(CaAsset.class),false);
obj.setAssetId(obj.getAssetId());
try {
dao.insert(obj);
Assert.fail("Must throw exception");
} catch (EntityExistsException ex) {
System.out.println("Pass1:" + ex.getMessage());
}
try {
CaAsset obj1 = new CaAsset();
obj1.setAcctId(12L);
obj1.setNormal("sfddfdfd");
dao.batchInsert(Arrays.asList(obj, obj1));
Assert.fail("Must throw exception");
} catch (EntityExistsException ex) {
System.out.println("Pass2:" + ex.getMessage());
}
}
@Test
public void testForChenfy() throws SQLException {
TestEntity t1 = new TestEntity();
t1.setField1("aaaaa");
t1.setField2("萨芬的男生方式飞上的风格 ");
t1.setBinaryData("afdsfgsdgfdgdfgfd0".getBytes());
db.insert(t1);
System.out.println("自增主键值:" + t1.getLongField());
{
if (!ORMConfig.getInstance().isEnableLazyLoad()) {
ORMConfig.getInstance().setEnableLazyLoad(true);
}
// 测试OB延迟加载功能
TestEntity q = new TestEntity();
q.setLongField(t1.getLongField());
t1 = db.load(q);
System.out.println(t1.getField2());
assertEquals("萨芬的男生方式飞上的风格 ", t1.getField2());
}
}
/**
* 使用Between条件查询
*
* @throws SQLException
*/
@Test
public void testSelectBetween() throws SQLException {
db.delete(QB.create(TestEntity.class));
TestEntity t1 = RandomData.newInstance(TestEntity.class);
t1.setDateField(DateUtils.get(2012, 5, 1, 16, 24, 30));
db.insert(t1);
Query<TestEntity> query = QB.create(TestEntity.class);
java.util.Date d = DateUtils.getDate(2012, 5, 1);
query.addCondition(QB.between(TestEntity.Field.dateField, DateUtils.dayBegin(d), DateUtils.dayEnd(d)));
System.out.println(db.count(query));
List<TestEntity> list = db.select(query);
assertEquals(1, list.size());
}
@Test
public void testaBatch1() throws SQLException {
TestEntity t1 = RandomData.newInstance(TestEntity.class);
t1.setLongField(0);
db.batchInsert(Arrays.asList(t1));
long n = t1.getLongField();
System.out.println(t1.getLongField());
}
/**
* @测试功能 批量插入
*
* @throws SQLException
*/
@Test
public void testCase2() throws SQLException {
System.out.println("=========== testCase2 ===========");
TestEntity t1 = RandomData.newInstance(TestEntity.class);
TestEntity t2 = RandomData.newInstance(TestEntity.class);
TestEntity t3 = RandomData.newInstance(TestEntity.class);
TestEntity t4 = RandomData.newInstance(TestEntity.class);
t1.setLongField(0);
t2.setLongField(2);
t3.setLongField(3);
t4.setLongField(9);
db.batchInsert(Arrays.asList(t1, t2, t3, t4));
long n = t1.getLongField();
assertEquals(n, t1.getLongField());
assertEquals(n + 1, t2.getLongField());
assertEquals(n + 2, t3.getLongField());
assertEquals(n + 3, t4.getLongField());
}
/**
* @测试功能 Batch update 更新包括BLOB在内的多个字段,更新为表达式,当前日期等多种值
*
* @throws SQLException
*/
@Test
public void testCase3() throws SQLException {
insert3Records();
// 测试
{
List<TestEntity> list = db.selectAll(TestEntity.class);
for (TestEntity t1 : list) {
t1.setBoolField(false);
t1.setField1("update!" + t1.getField1());
t1.setBinaryData("updated!".getBytes());// 简单的更新,直接在对象赋值
// 下面是集中复杂的更新赋值
t1.prepareUpdate(TestEntity.Field.doubleField, TestEntity.Field.doubleField2);// 更新为另外一个字段的值
t1.prepareUpdate(TestEntity.Field.dateField, db.func(Func.now)); // 更新为数据库的当前时间
t1.prepareUpdate(TestEntity.Field.intFiled, new JpqlExpression("intFiled + intField2"));// 更新为当前字段值加上另一个字段的值
}
db.batchUpdate(list);
}
// 开始检查数据
{
List<TestEntity> list = db.selectAll(TestEntity.class);
for (TestEntity t1 : list) {
assertEquals(t1.isBoolField(), false);
assertTrue(t1.getField1().startsWith("update!"));
assertEquals("updated!", new String(t1.getBinaryData()));
}
}
}
/**
* 测试单条语句更新记录
*
* @throws SQLException
*/
@Test
public void testUpdate() throws SQLException {
long lastId = insert3Records();
{
TestEntity t1 = new TestEntity();
t1.setLongField(lastId - 2);
t1 = db.load(t1);
t1.setField2(null);
t1.prepareUpdate(TestEntity.Field.dateField, db.func(Func.current_timestamp));
t1.setBinaryData("人间".getBytes());
int i = db.update(t1);
assertEquals(1, i);
}
}
/**
* 测试单条语句更新记录
*
* @throws SQLException
*/
@Test
public void testUpdateDynamicLess() throws SQLException {
boolean dynamic = ORMConfig.getInstance().isDynamicUpdate();
ORMConfig.getInstance().setDynamicUpdate(false);
Transaction db = this.db.startTransaction();
long lastId = insert3Records();
{
LogListener listener = new LogListener("update TEST_ENTITY set.+");
TestEntity t1 = new TestEntity();
t1.setLongField(lastId - 2);
t1 = db.load(t1);
t1.getQuery().addCondition(QB.eq(TestEntity.Field.longField2, t1.getLongField2()));
t1.setBinaryData("Hello".getBytes());
// t1.setLongField(12356);
int i = db.update(t1);
assertEquals(1, i);
}
db.rollback(true);
ORMConfig.getInstance().setDynamicUpdate(dynamic);
}
/**
* 在SQLServer中,如果主键列被标记为自增键值 Identity,那么将无法通过Update预计更新主键列的值。
*
* @throws SQLException
*/
@Test(expected = SQLException.class)
@IgnoreOn(allButExcept = "sqlserver")
public void testSqlServerUpdateId() throws SQLException {
insert3Records();
TestEntity entity = db.load(QB.create(TestEntity.class));
if (entity == null) {
return;
}
entity.setLongField(9123);
entity.getQuery().addCondition(TestEntity.Field.longField2, entity.getLongField2());
db.update(entity);
}
@Test
@IgnoreOn("sqlite")
// SQLite由于当前时区的问题,该案例不过
public void testUpdate2() throws SQLException {
db.delete(QB.create(TestEntity.class));
long lastId = insert3Records();
// 增加案例,支持
{
TestEntity t1 = new TestEntity();// >>>
t1.getQuery().addCondition(new FBIField("date(createTime)"), DateUtils.sqlToday());
t1.setField2("uuuuuuuuuuuuuu");
int i = db.update(t1);
assertEquals(3, i);
}
{
// 这个案例测试时要注意,在Oracle中,即便传入java.sql.Date对象,Oracle仍然会将其当作date类型(带时分秒进行判断)
TestEntity t1 = new TestEntity();
t1.getQuery().addCondition(new FBIField("date(createTime)"), DateUtils.sqlToday());
int i = db.delete(t1);
assertEquals(3, i);
}
}
/**
* 测试遍历模式的查询
*
* @throws SQLException
*/
@Test
public void testCasex() throws SQLException {
// 准备数据
db.delete(QB.create(TestEntity.class));
TestEntity t0 = RandomData.newInstance(TestEntity.class);
db.insert(t0);
db.insert(t0);
db.insert(t0);
db.insert(t0);
db.insert(t0);
List<TestEntity> list = db.selectAll(TestEntity.class);
// 开始测试
int n = 0;
ResultIterator<TestEntity> iter = db.iteratedSelect(QB.create(TestEntity.class), null);
try {
for (; iter.hasNext();) {
iter.next();
n++;
}
} finally {
iter.close();
}
assertEquals(list.size(), n);
}
@Test
public void testIterated() throws SQLException {
insert3Records();
// 准备数据
List<TestEntity> list = db.selectAll(TestEntity.class);
// 开始测试
int n = 0;
ResultIterator<TestEntity> iter = db.getSqlTemplate(null).iteratorBySql("select * from test_entity", new Transformer(TestEntity.class), 0, 0);
try {
for (; iter.hasNext();) {
iter.next();
n++;
}
} finally {
iter.close();
}
assertEquals(list.size(), n);
}
@Test
public void testCasex1() throws SQLException {
// 准备数据
db.delete(QB.create(TestEntity.class));
TestEntity t0 = RandomData.newInstance(TestEntity.class);
db.insert(t0);
db.insert(t0);
db.insert(t0);
db.insert(t0);
db.insert(t0);
NativeQuery<TestEntity> query = db.createNativeQuery("select * from test_entity", TestEntity.class);
ResultIterator<TestEntity> iter = query.getResultIterator();
int n = 0;
try {
for (; iter.hasNext();) {
TestEntity entity = iter.next();
n++;
}
} finally {
iter.close();
}
assertEquals(5, n);
}
/**
* 测试删除记录
*
* @throws SQLException
*/
@Test
public void testRemove() throws SQLException {
long lastId = insert3Records();
TestEntity t1 = new TestEntity();
t1.setLongField(lastId - 1);
t1 = db.load(t1);
t1.setBinaryData("人间".getBytes());
t1.getQuery().addCondition(TestEntity.Field.dateField, db.func(Func.current_timestamp));
t1.clearQuery();
int deleted = db.delete(t1);// 清除了刚刚设置进去的条件
assertEquals(1, deleted);
}
/**
* 测试分页查找
*
* @throws SQLException
*/
@Test
public void testPaging() throws SQLException {
insert3Records();
insert3Records();
insert3Records();
System.out.println("=========== testPaging Begin ==========");
Query<TestEntity> q = QB.create(TestEntity.class);
Selects select = QB.selectFrom(q);
select.column(TestEntity.Field.longField).as("lf1").toField("longField");
// q.addCondition(TestEntity.Field.boolField, true);
q.orderByAsc(TestEntity.Field.longField);
PagingIterator<TestEntity> page = db.pageSelect(q, 5);
System.out.println("Total Page:" + page.getTotalPage());
for (; page.hasNext();) {
List<TestEntity> list = page.next();
}
int count = (int) page.getTotal();
System.out.println("=========== testPaging End ==========");
List<TestEntity> entities = db.select(q, new IntRange(count - 1, count + 1));// 查出3条是错误的。只能查出两条
for (TestEntity e : entities) {
System.out.println(e);
}
assertEquals(2, entities.size());
}
/**
* 测试批量删除
*
* @throws SQLException
*/
@Test
public void testBatchRemove() throws SQLException {
db.delete(QB.create(TestEntity.class));
insert3Records();
long lastId = insert3Records();
int num = db.count(QB.create(TestEntity.class));
assertEquals(6, num);
System.out.println("=========== testBatchRemove Begin ==========");
TestEntity t1 = new TestEntity();
TestEntity t3 = new TestEntity();
TestEntity t5 = new TestEntity();
t1.setLongField(lastId - 4);
t3.setLongField(lastId - 2);
t5.setLongField(lastId);
List<TestEntity> batch = new ArrayList<TestEntity>();
batch.add(t1);
batch.add(t3);
batch.add(t5);
db.executeBatchDeletion(batch);
num = db.count(QB.create(TestEntity.class));
assertEquals(3, num);
System.out.println("=========== testBatchRemove Begin ==========");
}
/**
* 测试用Field=Field这样的表达式作为条件
*
* @throws SQLException
*/
@Test
public void testFieldToField() throws SQLException {
java.util.Date date = new java.util.Date();
TestEntity data = RandomData.newInstance(TestEntity.class);
data.setBoolField(true);
data.setBoolField2(true);
data.setField2("hello world!!");
data.setDateField(date);
db.insert(data);
TestEntity e = new TestEntity();
e.setBoolField(false);
e.getQuery().addCondition(TestEntity.Field.boolField, TestEntity.Field.boolField2);
e.getQuery().addCondition(TestEntity.Field.dateField, date);
int count = db.update(e);
assertEquals(1, count);
}
/**
* 测试使用NativeQuery来查询数据
*
* @throws SQLException
*/
@Test
public void testNativeQueryLike() throws SQLException {
db.truncate(TestEntity.class);
TestEntity data = RandomData.newInstance(TestEntity.class);
data.setField2("hello aa world!!");
db.insert(data);
NativeQuery<TestEntity> q = db.createNativeQuery("select * from test_entity where field_2 like :likestr<$string$> ", TestEntity.class);
q.setParameter("likestr", "aa");
// 查询并检查数据
assertEquals(1, q.getResultCount());
List<TestEntity> result = q.getResultList();
assertEquals(1, result.size());
}
private long insert3Records() throws SQLException {
// ORMConfig.getInstance().setDebugMode(false);
TestEntity t1 = RandomData.newInstance(TestEntity.class);
t1.setLongField(1);
db.insert(t1);
TestEntity t2 = RandomData.newInstance(TestEntity.class);
t1.setLongField(2);
db.insert(t2);
TestEntity t3 = RandomData.newInstance(TestEntity.class);
t1.setLongField(3);
db.insert(t3);
ORMConfig.getInstance().setDebugMode(true);
return t3.getLongField();
}
/**
* Normal Insert And load
*
* @throws SQLException
*/
@Test
public void testCassetInsertLoad() throws SQLException {
Query<?> q = QB.create(CaAsset.class);
QB.selectFrom(q).column(CaAsset.Field.assetId).max();
q.getResultTransformer().setResultType(Integer.class);
Integer max = db.load(q);
if (max == null)
max = 0;
System.out.println("=========== test1 ========");
CaAsset t2 = new CaAsset();
t2.setAssetId(max + 1);
t2.setAssetType(1);
t2.setNormal("aa");
db.insert(t2);
CaAsset t3 = new CaAsset();
t3.setAssetId(max + 2);
t3.setNormal("bb");
db.insert(t3);
t2 = db.load(t2);
t3 = db.load(t3);
db.delete(t2);
db.delete(t3);
}
@IgnoreOn(allButExcept="hsqldb")
@Test
public void testAssignPK() throws SQLException {
System.out.println("=========== testAssignPK ========");
CaAsset t1 = new CaAsset();
t1.setAssetId(500);
t1.setAssetType(1);
db.insert(t1);
}
/**
* Batch Insert
*
* @throws SQLException
*/
@Test
public void testCaAssetBatchInsert() throws SQLException {
System.out.println("=========== test2 ========");
CaAsset t1 = new CaAsset();
t1.setNormal("aaa123");
CaAsset t2 = new CaAsset();
t2.setNormal("aaa124");
CaAsset t3 = new CaAsset();
t3.setNormal("aaa125");
CaAsset t4 = new CaAsset();
t4.setNormal("aaa126");
db.batchInsert(Arrays.asList(t1, t2, t3, t4));
long n = t1.getAssetId();
assertEquals(n, t1.getAssetId());
assertEquals(n + 1, t2.getAssetId());
assertEquals(n + 2, t3.getAssetId());
assertEquals(n + 3, t4.getAssetId());
CaAsset t1_1 = db.load(t1);
assertEquals("aaa123", t1_1.getNormal());
}
/**
* Batch update
*
* @throws SQLException
*/
@Test
public void testCaAssetBatchUpdate() throws SQLException {
System.out.println("=========== test3 ========");
List<CaAsset> list = db.selectAll(CaAsset.class);
CaAsset t1 = list.get(0);
t1.prepareUpdate(CaAsset.Field.assetType, 1);
db.batchUpdate(list);
// Batch<CaAsset> batch = db.startBatchUpdate(t1);
// for (CaAsset t : list) {
// batch.add(t);
// }
// batch.commit();
}
@Test
public void testCase4() throws SQLException {
// 准备数据
db.delete(QB.create(CaAsset.class));
int n = 4;
CaAsset t1 = new CaAsset();
t1.setAssetId(1);
t1.setThedate(new Date());
CaAsset t2 = new CaAsset();
t2.setThedate(new Date());
t2.setAssetId(2);
CaAsset t3 = new CaAsset();
t3.setThedate(new Date());
t3.setAssetId(3);
CaAsset t4 = new CaAsset();
t4.setThedate(new Date());
t4.setAssetId(4);
db.batchInsert(Arrays.asList(t1, t2, t3, t4));
// 开始测试
Query<CaAsset> q = QB.create(CaAsset.class);
q.addCondition(CaAsset.Field.thedate, DateUtils.dayBegin(new Date()));
q.getInstance().prepareUpdate(CaAsset.Field.assetType, 3);
db.update(q.getInstance());
}
@Test
public void testCaAssetUpdate() throws SQLException {
CaAsset data = RandomData.newInstance(CaAsset.class);
data.setAcctId(123L);
data.setNormal("hello world!");
data.setThedate(new Date());
db.insert(data);
System.out.println("=========== testCaAssetUpdate ========");
CaAsset t1 = new CaAsset();
t1.setAssetId(data.getAssetId());
t1 = db.load(t1);
t1.prepareUpdate(CaAsset.Field.assetType, 3);
t1.prepareUpdate(CaAsset.Field.thedate, new Date());
t1.setNormal("dsdsdfsdf");
int count = db.update(t1);
assertEquals(1, count);
}
@Test
public void testCaAssetRemove() throws SQLException {
int max = db.loadBySql("select max(asset_id) from ca_asset", Integer.class);
CaAsset t1 = new CaAsset();
t1.setAssetId(max);
t1 = db.load(t1);
int count = db.delete(t1);
assertEquals(1, count);
}
@Test
public void testCaAssetPaging() throws SQLException {
Query<CaAsset> q = QB.create(CaAsset.class);
q.addCondition(CaAsset.Field.assetId, Operator.IN, Arrays.asList(new Long[] { 4L, 3L }));
PagingIterator<CaAsset> page = db.pageSelect(q, 5);
System.out.println("Total Page:" + page.getTotalPage());
for (; page.hasNext();) {
List<CaAsset> list = page.next();
}
}
@Test
public void testBatchInsertTrans() throws SQLException {
// 清除全部数据
db.delete(QB.create(CaAsset.class));
assertEquals(0, db.selectAll(CaAsset.class).size());
// 创建事务
Transaction t = db.startTransaction();
List<CaAsset> batch1 = new ArrayList<CaAsset>();
batch1.add(new CaAsset("t1"));
batch1.add(new CaAsset("t2"));
batch1.add(new CaAsset("t3"));
batch1.add(new CaAsset("t4"));
t.batchInsert(batch1);// 批提交
assertEquals(4, t.selectAll(CaAsset.class).size());// 从事务中查询到已插入的四条数据。
// assertEquals(0,db.selectAll(CaAsset.class).size());//从事务外查询不到这四条数据(Oracle事务是隔离的,这里直接返回0。但是在derby上测试,由于表被锁,这里的查询无法返回结果,死锁)。
t.rollback(true);// 回滚
assertEquals(0, db.selectAll(CaAsset.class).size());// 还是查不到这四条数据
}
/**
* 测试能否把一个复杂SQL语句正确的转换为Count语句并执行分页查询
*
* @throws SQLException
*/
@Test
public void testComplexPageSQL() throws SQLException {
String sql = "SELECT t2.* FROM ca_asset t2, (SELECT t.field_1, MAX(t.longfield) AS wo_run_id FROM test_entity t " + "GROUP BY t.field_1) t3 WHERE t2.normal = t3.field_1 AND t2.asset_type = t3.wo_run_id";
PagingIterator<Person> pp = db.pageSelect(sql, Person.class, 10);
assertEquals(0, pp.getTotal());
}
/**
* 使用Max函数的三种办法
*
* @throws SQLException
*/
@Test
public void testMax() throws SQLException {
insert3Records();
// 方法1
Query<TestEntity> query = QB.create(TestEntity.class);
Selects s = QB.selectFrom(query);
s.column(TestEntity.Field.longField).max().as("max_count");
int max1 = db.selectAs(query, Integer.class).get(0);
// 方法2
int max2 = db.createNativeQuery("select max(longfield) from test_entity", Integer.class).getSingleResult();
// 方法3 不支持schema重定向
int max3 = (int) db.loadBySql("select max(longfield) from test_entity", Integer.class);
assertEquals(max1, max2);
assertEquals(max2, max3);
}
/**
* @throws SQLException
* @测试目的 添加orderby条件时使用父类entity中的field发生异常的BUG是否已被修复(see Trac#78601)
* @预期结果 查询操作能正常解析并执行
*/
@Test
public void testOrderByUsingParentField() throws SQLException {
TestEntitySon entity = new TestEntitySon();
db.dropTable(entity);
db.createTable(entity);
entity.getQuery().setAllRecordsCondition();
entity.getQuery().addOrderBy(true, TestEntity.Field.field1);
db.select(entity);
}
/**
*
* And Or互相嵌套,再加上like语句的转义等混合场景下的操作.
*
* Test And\or\Like(escape)
*
* @throws SQLException
*/
@Test
public void testCaseAndOr_Like() throws SQLException {
TestEntity t = new TestEntity();
t.setField1("Here insert field value");
t.setField2("asa1bbb");
t.setIntField2(1);
t.setBoolField(true);
db.insert(t); // 插入记录
{
System.out.println("======= 1 ========");
t.setField1("value is updated!"); // 设置要更新的数据
// (int_field_2=? and boolField=?)
Condition and = QB.and(QB.eq(TestEntity.Field.intField2, 3), QB.eq(TestEntity.Field.boolField, Boolean.FALSE));
// ((int_field_2=? and boolField=?) or field_2 like ? escape '/' )
Condition or = QB.or(and, QB.matchStart(TestEntity.Field.field2, "asa_") // 此处将自动转义
);
// ((int_field_2=? and boolField=?) or field_2 like ? escape '/' )
// and int_field_2=?
t.getQuery().addCondition(or);
t.getQuery().addCondition(TestEntity.Field.intField2, 1);
System.out.println("======== a =======");
db.update(t);
}
{
System.out.println("======== 2 =======");
System.out.println(ORMConfig.getInstance().isSpecifyAllColumnName());
TestEntity q = new TestEntity();
And and = new And();
and.addCondition(TestEntity.Field.dateField, new Date());
and.addCondition(TestEntity.Field.boolField, Boolean.FALSE);
Or or = new Or();
or.addCondition(new Not(and));
or.addCondition(TestEntity.Field.field2, Operator.MATCH_END, "asa");
q.getQuery().addCondition(or);
q.getQuery().addCondition(TestEntity.Field.intField2, 1);
db.select(q);
System.out.println("=========================");
}
db.delete(t); // 删除数据
}
@Test
public void testBatchLoad() throws SQLException {
CaAsset ca = db.load(CaAsset.class, 12);
List<CaAsset> ca1 = db.selectByField(CaAsset.Field.acctId, 12);
Integer[] a = new Integer[501];
ORMConfig.getInstance().setDebugMode(false);
for (int i = 0; i < 501; i++) {
a[i] = i + 1;
}
List<CaAsset> list1 = db.batchLoad(CaAsset.class, Arrays.asList(a));
List<CaAsset> list2 = db.batchLoadByField(CaAsset.Field.acctId, Arrays.asList(a));
ORMConfig.getInstance().setDebugMode(true);
}
/**
* 测试NotNull计算符含义在Oracle下的统一
*
* @throws SQLException
*/
@Test
@IgnoreOn(allButExcept = { "oracle", "postgresql" })
public void testIsNull() throws SQLException {
db.executeSql("delete from ca_asset where normal is null");
int old = db.count(QB.create(CaAsset.class));
CaAsset ca = new CaAsset();
ca.setNormal("");
db.insert(ca);
System.out.println(db.select(QB.create(CaAsset.class)));
CaAsset a = new CaAsset();
a.getQuery().addCondition(QB.notNull(CaAsset.Field.normal));
a.getQuery().addCondition(QB.ne(CaAsset.Field.normal, ""));
int v = db.select(a).size();
assertEquals(old, v);
}
}