package jef.database.nativequery; import java.sql.SQLException; import java.util.List; import jef.codegen.EntityEnhancer; import jef.common.log.LogUtil; import jef.database.DbClient; import jef.database.NamedQueryConfig; import jef.database.NativeQuery; import jef.database.PagingIterator; import jef.database.QB; import jef.database.query.SqlExpression; import jef.database.test.DataSource; import jef.database.test.DataSourceContext; import jef.database.test.DatabaseInit; import jef.database.test.JefJUnit4DatabaseTestRunner; import jef.orm.multitable2.TextValuePair; import jef.orm.multitable2.model.Child; import jef.orm.multitable2.model.EnumationTable; import jef.orm.multitable2.model.Leaf; import jef.tools.reflect.BeanUtils; import jef.tools.string.RandomData; import org.apache.commons.lang.StringUtils; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; /** * NamedQuery测试类 * * @see NamedQueryConfig * @see NativeQuery * * @Date 2013-1-4 */ @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 NamedQueryTest { private DbClient db; @DatabaseInit public void setUp() { try { // clear table db.dropTable(Leaf.class); db.dropTable(Child.class); db.dropTable(EnumationTable.class); db.createTable(Leaf.class,Child.class,EnumationTable.class); // insert data Leaf leaf; for (int i = 0, n = 5; i < n; i++) { leaf = RandomData.newInstance(Leaf.class); db.insert(leaf); } } catch (SQLException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } /** * @测试目的 测试以下特性:自行编写的NativeQuery也可以由框架来分页查询 */ @SuppressWarnings({ "rawtypes", "unchecked" }) @Test public void testPaging() { LogUtil.show(StringUtils.center("testPaging", 50, "=")); try { NativeQuery nq = db.createNamedQuery("testPaging"); String rawSql = ((NamedQueryConfig) BeanUtils.getFieldValue(nq, "config")).getRawsql(); LogUtil.show("========rawSql: " + rawSql); Assert.assertEquals("select * from leaf", rawSql); Leaf leaf = new Leaf(); leaf.getQuery().setAllRecordsCondition(); leaf.getQuery().setCascade(false); int count = db.select(leaf).size(); PagingIterator pageIter = db.pageSelect(nq, 2); Assert.assertEquals(count % 2 == 0 ? count / 2 : count / 2 + 1, pageIter.getTotalPage()); } catch (SQLException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } /** * @测试目的 测试以下特性:动态省略SQL表达式 */ @SuppressWarnings("rawtypes") @Test public void testDynamicOmit() { LogUtil.show(StringUtils.center("testDynamicOmit", 50, "=")); NativeQuery nq = db.createNamedQuery("testDynamicOmit"); String rawSql = ((NamedQueryConfig) BeanUtils.getFieldValue(nq, "config")).getRawsql(); LogUtil.show("========rawSql: " + rawSql); Assert.assertEquals("select * from leaf where name =:name and childid = :childid<int>", rawSql); nq.setParameterByString("childid", "4"); List result = nq.getResultList(); LogUtil.show("========rawSql result: " + result); } /** * @测试目的 测试以下特性:使用动态SQL片段来更自由定义SQL(要检索的字段名及order by为动态传入的场景) */ @SuppressWarnings("rawtypes") @Test public void testDynamicSegments() { LogUtil.show(StringUtils.center("testDynamicSegments", 50, "=")); NativeQuery nq = db.createNamedQuery("testDynamicSegments"); String rawSql = ((NamedQueryConfig) BeanUtils.getFieldValue(nq, "config")).getRawsql(); LogUtil.show("========rawSql: " + rawSql); Assert.assertEquals("select :column<sql> from leaf order by :orderBy<sql>", rawSql); nq.setParameterByString("column", "id,name"); nq.setParameterByString("orderBy", "id desc"); List result = nq.getResultList(); LogUtil.show("========rawSql result: " + result); try { int count = db.count(QB.create(Leaf.class)); Assert.assertEquals(count, nq.getResultCount()); } catch (SQLException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } /** * @测试目的 测试以下特性:<br> * 1)使用动态SQL片段来更自由定义SQL(表名为动态传入的场景)<br> * 2)返回值为{@code TextValuePair}类型的 */ @Test public void testDynamicSegmentsForTableName() { LogUtil.show(StringUtils.center("testDynamicSegmentsForTableName", 50, "=")); NativeQuery<TextValuePair> nq = db.createNamedQuery("testDynamicSegmentsForTableName", TextValuePair.class); String rawSql = ((NamedQueryConfig) BeanUtils.getFieldValue(nq, "config")).getRawsql(); LogUtil.show("========rawSql: " + rawSql); Assert.assertEquals("select id as text, name as value from :tableName<sql>", rawSql); // 以下几种写法均可以 // nq.setParameterByString("tableName", new String[] { "leaf" }); // nq.setParameterByString("tableName", "leaf"); // nq.setParameter("tableName", new String[] { "leaf" }); // nq.setParameter("tableName", "leaf"); nq.setParameter("tableName", new SqlExpression("leaf")); List<TextValuePair> result = nq.getResultList(); LogUtil.show("========rawSql result: " + result); try { int count = db.count(QB.create(Leaf.class)); Assert.assertEquals(count, nq.getResultCount()); } catch (SQLException e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } }