package jef.orm.multitable2;
import java.sql.SQLException;
import jef.codegen.EntityEnhancer;
import jef.database.DbClient;
import jef.database.QB;
import jef.database.query.Query;
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.orm.multitable2.model.Child;
import jef.orm.multitable2.model.Code;
import jef.orm.multitable2.model.EnumationTable;
import jef.orm.multitable2.model.Parent;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(JefJUnit4DatabaseTestRunner.class)
@DataSourceContext({
@DataSource(name="oracle",url="${oracle.url}",user="${oracle.user}",password="${oracle.password}"),
@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 = "sqlserver", url = "${sqlserver.url}",user="${sqlserver.user}",password="${sqlserver.password}")
})
public class SpecialCases extends org.junit.Assert{
//TODO 增加测试案例关于 rowid, 增加案例关于getFunction
// ===== 关于rowid的支持 ==============
// 1、除非配置db.enable.rowid=false,否则在Oracle环境下总是会启用rowid特性。
//
// 当使用rowid特性后,凡是单表查询、单条插入都会在对象中设置rowid。
// 凡是无Query场合下的查询、删除、更新,总是会使用rowid作为条件。
// 此外,可以通过api obj.rowid()获取rowid(),如果对象中没有获得rowid,那么总是返回null.
//
// 关于sysdate支持
// 1、当date类型字段的Annotation定义中加上
// @GeneratedValue后,如果没有手工设置过date字段的值,那么就会在插入数据库的时候将其改用
// sysdate 对Oracle
// now() 对MySQL
// current_timestamp 对Derby
// 要注意,目前没有提供任何办法将这个字段立刻返回到对象中,除非load一次。
//
//
// 2、查询和更新时
// 更新时:
// t1.prepareUpdate(TestEntity.Field.dateField, db.get(DbFunction.SYSDATE));
//
// 查询和删除时
// t1.getQuery().addCondition(TestEntity.Field.dateField,
// Operator.BETWEEN_L_L,new
// Object[]{db.get(DbFunction.SYSDATE),TestEntity.Field.dateField});
private DbClient db;
@DatabaseInit
public void parepare() throws SQLException{
db.createTable(Child.class);
db.createTable(Parent.class);
db.createTable(EnumationTable.class);
db.createTable(Code.class);
}
/**
* 从实体关联以不同关联路径多次关联另一张表,
*
* @throws SQLException
*/
@Test
public void testSelectDoubleJoin() throws SQLException {
Query<Code> cc = QB.create(Code.class);
db.select(cc, null);
}
/**
* Test Sequence name
* 案例说明<p>
* 在ChildCC中,通过<code>@SequenceGenerator(sequenceName="MAIN1")</code> 的注解来指定Sequence的名称,从而不使用默认的Sequence名称。
* @throws SQLException
*/
@Test
@IgnoreOn(allButExcept={"oracle"})
public void testCustomSequenceName() throws SQLException{
db.dropTable(Code.class);
LogListener listener=new LogListener("create sequence ([a-zA-z0-9\\.]+)\\s+.*");
db.createTable(Code.class);
String sequenceName=listener.getSingleMatch()[0];
assertEquals("MAIN1", sequenceName);
}
/**
* 可以在静态的Join参数中配置JPQL变量甚至SQL片段。
* @throws SQLException
*/
@Test
public void testJoinWithCustomCondition() throws SQLException {
Child c=new Child();
c.setId(2);
c.getQuery().setAttribute("aaa", "child");
db.load(c);
}
}