From 0bfa84ba1fb0623cc3ea79203b575f57945651b6 Mon Sep 17 00:00:00 2001 From: Peter Zhang Date: Tue, 12 Aug 2014 16:22:46 +0800 Subject: [PATCH] fix issue #675 --- src/org/nutz/dao/Dao.java | 14 +++++ src/org/nutz/dao/impl/NutDao.java | 56 ++++++++++++++++--- .../sql/pojo/PojoFetchObjectCallback.java | 20 +++++++ test/org/nutz/dao/test/meta/Pet.java | 11 ++++ .../nutz/dao/test/normal/SimpleDaoTest.java | 29 ++++++++-- 5 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 src/org/nutz/dao/impl/sql/pojo/PojoFetchObjectCallback.java diff --git a/src/org/nutz/dao/Dao.java b/src/org/nutz/dao/Dao.java index bdd7e1e7e..45226eb28 100644 --- a/src/org/nutz/dao/Dao.java +++ b/src/org/nutz/dao/Dao.java @@ -804,6 +804,8 @@ int updateRelation(Class classOfT, */ int func(Class classOfT, String funcName, String fieldName); + Object func2(Class classOfT, String funcName, String fieldName); + /** * 对某一个数据表字段,进行计算。 * @@ -817,6 +819,8 @@ int updateRelation(Class classOfT, */ int func(String tableName, String funcName, String colName); + Object func2(String tableName, String funcName, String colName); + /** * 对某一个对象字段,进行计算。 * @@ -832,6 +836,11 @@ int updateRelation(Class classOfT, */ int func(Class classOfT, String funcName, String fieldName, Condition cnd); + Object func2(Class classOfT, + String funcName, + String fieldName, + Condition cnd); + /** * 对某一个数据表字段,进行计算。 * @@ -847,6 +856,11 @@ int updateRelation(Class classOfT, */ int func(String tableName, String funcName, String colName, Condition cnd); + Object func2(String tableName, + String funcName, + String colName, + Condition cnd); + /** * 根据数据源的类型,创建一个翻页对象 * diff --git a/src/org/nutz/dao/impl/NutDao.java b/src/org/nutz/dao/impl/NutDao.java index 656547e53..86ba67587 100644 --- a/src/org/nutz/dao/impl/NutDao.java +++ b/src/org/nutz/dao/impl/NutDao.java @@ -36,6 +36,7 @@ import org.nutz.dao.impl.sql.pojo.PojoEachRecordCallback; import org.nutz.dao.impl.sql.pojo.PojoFetchEntityCallback; import org.nutz.dao.impl.sql.pojo.PojoFetchIntCallback; +import org.nutz.dao.impl.sql.pojo.PojoFetchObjectCallback; import org.nutz.dao.impl.sql.pojo.PojoFetchRecordCallback; import org.nutz.dao.impl.sql.pojo.PojoQueryEntityCallback; import org.nutz.dao.impl.sql.pojo.PojoQueryRecordCallback; @@ -79,6 +80,8 @@ public class NutDao extends DaoSupport implements Dao { private PojoCallback _pojo_fetchInt; + private PojoCallback _pojo_fetchObject; + protected volatile long _selfId; // ========================================================== @@ -91,6 +94,7 @@ public NutDao() { _pojo_fetchEntity = new PojoFetchEntityCallback(); _pojo_eachEntity = new PojoEachEntityCallback(); _pojo_fetchInt = new PojoFetchIntCallback(); + _pojo_fetchObject = new PojoFetchObjectCallback(); _pojo_queryRecord = new PojoQueryRecordCallback(); _pojo_fetchRecord = new PojoFetchRecordCallback(); _pojo_eachRecord = new PojoEachRecordCallback(); @@ -136,10 +140,10 @@ public void invoke(int i, Object ele, int length) throws ExitLoop, } public void insert(String tableName, Chain chain) { - if (chain.isSpecial()) { - Daos.insertBySpecialChain(this, null, tableName, chain); - return; - } + if (chain.isSpecial()) { + Daos.insertBySpecialChain(this, null, tableName, chain); + return; + } EntityOperator opt = _optBy(chain.toEntityMap(tableName)); if (null == opt) return; @@ -148,10 +152,10 @@ public void insert(String tableName, Chain chain) { } public void insert(Class classOfT, Chain chain) { - if (chain.isSpecial()) { - Daos.insertBySpecialChain(this, getEntity(classOfT), null, chain); - return; - } + if (chain.isSpecial()) { + Daos.insertBySpecialChain(this, getEntity(classOfT), null, chain); + return; + } EntityOperator opt = _opt(classOfT); opt.myObj = chain; opt.addInsertSelfOnly(); @@ -707,6 +711,42 @@ public int func(String tableName, return pojo.getInt(); } + public Object func2(Class classOfT, String func2Name, String fieldName) { + return func2(classOfT, func2Name, fieldName, null); + } + + public Object func2(String tableName, String func2Name, String colName) { + return func2(tableName, func2Name, colName, null); + } + + public Object func2(Class classOfT, + String func2Name, + String colName, + Condition cnd) { + Entity en = holder.getEntity(classOfT); + if (null != en.getField(colName)) + colName = en.getField(colName).getColumnName(); + DaoStatement pojo = pojoMaker.makeFunc(en.getViewName(), + func2Name, + colName) + .append(Pojos.Items.cnd(cnd)) + .setAfter(_pojo_fetchObject) + .setEntity(en); + _exec(pojo); + return pojo.getResult(); + } + + public Object func2(String tableName, + String func2Name, + String colName, + Condition cnd) { + DaoStatement pojo = pojoMaker.makeFunc(tableName, func2Name, colName) + .append(Pojos.Items.cnd(cnd)) + .setAfter(_pojo_fetchObject); + _exec(pojo); + return pojo.getResult(); + } + public Pager createPager(int pageNumber, int pageSize) { Pager pager = new Pager(); pager.setPageNumber(pageNumber); diff --git a/src/org/nutz/dao/impl/sql/pojo/PojoFetchObjectCallback.java b/src/org/nutz/dao/impl/sql/pojo/PojoFetchObjectCallback.java new file mode 100644 index 000000000..6adfd603f --- /dev/null +++ b/src/org/nutz/dao/impl/sql/pojo/PojoFetchObjectCallback.java @@ -0,0 +1,20 @@ +package org.nutz.dao.impl.sql.pojo; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.nutz.dao.sql.Pojo; +import org.nutz.dao.sql.PojoCallback; + +public class PojoFetchObjectCallback implements PojoCallback { + + public Object invoke(Connection conn, ResultSet rs, Pojo pojo) + throws SQLException { + if (null != rs && rs.next()) { + return rs.getObject(1); + } + return null; + } + +} diff --git a/test/org/nutz/dao/test/meta/Pet.java b/test/org/nutz/dao/test/meta/Pet.java index faa4f370d..e13b133af 100644 --- a/test/org/nutz/dao/test/meta/Pet.java +++ b/test/org/nutz/dao/test/meta/Pet.java @@ -52,6 +52,17 @@ public static Pet[] create(int num) { @Column private Timestamp birthday; + @Column + private float price; + + public float getPrice() { + return price; + } + + public void setPrice(float price) { + this.price = price; + } + public int getId() { return id; } diff --git a/test/org/nutz/dao/test/normal/SimpleDaoTest.java b/test/org/nutz/dao/test/normal/SimpleDaoTest.java index 99bbb9a55..8ddd72569 100644 --- a/test/org/nutz/dao/test/normal/SimpleDaoTest.java +++ b/test/org/nutz/dao/test/normal/SimpleDaoTest.java @@ -27,6 +27,7 @@ import org.nutz.dao.test.meta.SimplePOJO; import org.nutz.dao.test.meta.issue396.Issue396Master; import org.nutz.lang.Lang; +import org.nutz.lang.random.R; public class SimpleDaoTest extends DaoCase { @@ -38,11 +39,29 @@ private void insertRecords(int len) { for (int i = 0; i < len; i++) { Pet pet = Pet.create("pet" + i); pet.setNickName("alias_" + i); + pet.setPrice(R.random(30, 100) / 3.1415f); dao.insert(pet); } } - // for issue #515 写给 mysql 一个特殊的例子 + /** + * for issue #675 提供一个直接返回对象的方法 + */ + @Test + public void test_dao_func() { + insertRecords(10); + + int n = dao.func(Pet.class, "SUM", "price"); + assertTrue(n > 0); + + Object o = dao.func2(Pet.class, "SUM", "price"); + assertTrue((o instanceof Double)); + assertTrue(((Double) o).floatValue() > 0.0f); + } + + /** + * for issue #515 写给 mysql 一个特殊的例子 + */ @Test public void test_escape_char() { if (dao.meta().isMySql()) { @@ -275,10 +294,12 @@ public void test_insert_with() { return; dao.create(Issue396Master.class, true); } - + @Test public void test_insert_special_chain() { - if (dao.meta().isMySql()) - dao.insert(Pet.class, Chain.makeSpecial("birthday", "now()").add("name", "wendal")); + if (dao.meta().isMySql()) + dao.insert(Pet.class, + Chain.makeSpecial("birthday", "now()").add("name", + "wendal")); } }