This is an automated email from the ASF dual-hosted git repository.
doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git
The following commit(s) were added to refs/heads/master by this push:
new 1a76b1c2 EMPIREDB-431 DBUtils: handleQueryNoResult() method added
instead of throwing a QueryNoResultException
1a76b1c2 is described below
commit 1a76b1c250a623458d66437fd2f449d6b3af1dd8
Author: Rainer Döbele <[email protected]>
AuthorDate: Thu Oct 31 18:12:32 2024 +0100
EMPIREDB-431
DBUtils: handleQueryNoResult() method added instead of throwing a
QueryNoResultException
---
.../java/org/apache/empire/commons/ClassUtils.java | 11 ++-
.../main/java/org/apache/empire/db/DBUtils.java | 79 ++++++++++++++++++----
.../apache/empire/db/list/DBBeanListFactory.java | 2 +
.../empire/db/list/DBBeanListFactoryImpl.java | 6 ++
4 files changed, 83 insertions(+), 15 deletions(-)
diff --git a/empire-db/src/main/java/org/apache/empire/commons/ClassUtils.java
b/empire-db/src/main/java/org/apache/empire/commons/ClassUtils.java
index 6042dfdf..4dea6ecc 100644
--- a/empire-db/src/main/java/org/apache/empire/commons/ClassUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/commons/ClassUtils.java
@@ -438,6 +438,7 @@ public final class ClassUtils
* @param parameterTypes the param types
* @return the constructor or null
*/
+ @SuppressWarnings("unchecked")
public static <T> Constructor<T> findMatchingConstructor(Class<T> clazz,
int minParams, Class<?>... parameterTypes)
{
// Minimum matching params
@@ -463,7 +464,8 @@ public final class ClassUtils
// get all public constructors
Constructor<?>[] ctors = clazz.getConstructors();
-
+ Constructor<T> foundCtor = null;
+
// Search through all valid lengths
for (int pLen = paramSize; pLen >= minParams; pLen--)
{
@@ -508,14 +510,17 @@ public final class ClassUtils
} catch (SecurityException se) {
// ignore
}
- @SuppressWarnings("unchecked")
Constructor<T> typedCtor = (Constructor<T>) ctor;
return typedCtor;
}
+ else
+ { // set as found constructor
+ foundCtor = (Constructor<T>) ctors[i];
+ }
}
}
}
- return null;
+ return foundCtor;
}
/**
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
index 8e293723..38785c09 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
@@ -756,17 +756,37 @@ public class DBUtils implements DBContextAware
*
* @param sqlCmd the SQL-Command
* @param sqlParams list of query parameter values
+ * @param failOnNoResult if true a QueryNoResultException is thrown when
no result otherwise null is returned
*
- * @return the values of the first row
+ * @return the values of the first row or null
*/
- public Object[] querySingleRow(String sqlCmd, Object[] sqlParams)
+ public Object[] querySingleRow(String sqlCmd, Object[] sqlParams, boolean
failOnNoResult)
{
List<Object[]> result = new ArrayList<Object[]>(1);
queryObjectList(sqlCmd, sqlParams, result, 1);
- if (result.size()<1)
- throw new QueryNoResultException(sqlCmd);
+ if (result.size()<1) {
+ // no result
+ if (failOnNoResult)
+ throw new QueryNoResultException(sqlCmd);
+ // null
+ return null;
+ }
return result.get(0);
}
+
+ /**
+ * Returns all values of the first row of a sql-query as an array.
+ * If the query does not return a result a QueryNoResultException is thrown
+ *
+ * @param sqlCmd the SQL-Command
+ * @param sqlParams list of query parameter values
+ *
+ * @return the values of the first row
+ */
+ public final Object[] querySingleRow(String sqlCmd, Object[] sqlParams)
+ {
+ return querySingleRow(sqlCmd, sqlParams, true);
+ }
/**
* Returns all values of the first row of a sql-query as an array.
@@ -791,6 +811,16 @@ public class DBUtils implements DBContextAware
log.warn("Query Result was limited to {} by MAX_QUERY_ROWS",
MAX_QUERY_ROWS);
log.warn("********************************************************");
}
+
+ /**
+ * Called when a query has no result
+ * @param cmd
+ */
+ protected void handleQueryNoResult(DBCommandExpr cmd, Class<?> resultType)
+ {
+ // throw new QueryNoResultException(cmd.getSelect());
+ log.debug("The query for \"{}\" returned no result.",
resultType.getName());
+ }
/**
* Crates a default DataListFactory for a DataListEntry class
@@ -923,18 +953,16 @@ public class DBUtils implements DBContextAware
{
return queryDataList(cmd, DataListEntry.class, first, maxItems);
}
-
+
/**
* Queries a single DataListEntry item
- * @param failOnNoResult flag whether to fail on empty resultset
*/
- public final <T extends DataListEntry> T queryDataEntry(DBCommandExpr cmd,
Class<T> entryClass, boolean failOnNoResult)
+ public final <T extends DataListEntry> T queryDataEntry(DBCommandExpr cmd,
Class<T> entryClass, DataListHead head)
{
- DataListHead head = createDefaultDataListHead(cmd, entryClass);
List<T> dle = queryDataList(cmd,
createDefaultDataListFactory(entryClass, head), 0, 1);
if (dle.isEmpty())
- { if (failOnNoResult)
- throw new QueryNoResultException(cmd.getSelect());
+ { // No result
+ handleQueryNoResult(cmd, entryClass);
return null;
}
return dle.get(0);
@@ -942,14 +970,35 @@ public class DBUtils implements DBContextAware
/**
* Queries a single DataListEntry item
+ * @param cmd the query command
+ * @param entryClass the result class
+ * @return the result object
*/
public final <T extends DataListEntry> T queryDataEntry(DBCommandExpr cmd,
Class<T> entryClass)
{
- return queryDataEntry(cmd, entryClass, true);
+ DataListHead head = createDefaultDataListHead(cmd, entryClass);
+ return queryDataEntry(cmd, entryClass, head);
+ }
+
+ /**
+ * Queries a single DataListEntry item
+ * @Deprecated Please consider calling without the "failOnNoResult"
parameter and overriding handleQueryNoResult()
+ * @param cmd the query command
+ * @param entryClass the result class
+ * @param failOnNoResult flag whether to fail on empty resultset
+ */
+ @Deprecated
+ public final <T extends DataListEntry> T queryDataEntry(DBCommandExpr cmd,
Class<T> entryClass, boolean failOnNoResult)
+ {
+ T result = queryDataEntry(cmd, entryClass);
+ if (result==null && failOnNoResult)
+ throw new QueryNoResultException(cmd.getSelect());
+ return result;
}
/**
* Queries a single DataListEntry item
+ * @param cmd the query command
*/
public final DataListEntry queryDataEntry(DBCommandExpr cmd)
{
@@ -1246,7 +1295,13 @@ public class DBUtils implements DBContextAware
{ // prepare
factory.prepareQuery(cmd, context);
// Runquery
- r.getRecordData(cmd);
+ r.open(cmd);
+ // Get First Record
+ if (!r.moveNext())
+ { // No Result
+ handleQueryNoResult(cmd, factory.getBeanType());
+ return null;
+ }
// add data
T item = factory.newItem(-1, r);
// post processing
diff --git
a/empire-db/src/main/java/org/apache/empire/db/list/DBBeanListFactory.java
b/empire-db/src/main/java/org/apache/empire/db/list/DBBeanListFactory.java
index d4cfcb92..e1cc1cc6 100644
--- a/empire-db/src/main/java/org/apache/empire/db/list/DBBeanListFactory.java
+++ b/empire-db/src/main/java/org/apache/empire/db/list/DBBeanListFactory.java
@@ -33,4 +33,6 @@ public interface DBBeanListFactory<T extends Object>
T newItem(int rownum, DBRecordData recData);
void completeQuery(List<T> list);
+
+ Class<?> getBeanType();
}
diff --git
a/empire-db/src/main/java/org/apache/empire/db/list/DBBeanListFactoryImpl.java
b/empire-db/src/main/java/org/apache/empire/db/list/DBBeanListFactoryImpl.java
index 1724946b..ce611915 100644
---
a/empire-db/src/main/java/org/apache/empire/db/list/DBBeanListFactoryImpl.java
+++
b/empire-db/src/main/java/org/apache/empire/db/list/DBBeanListFactoryImpl.java
@@ -191,6 +191,12 @@ public class DBBeanListFactoryImpl<T> implements
DBBeanListFactory<T>
this(beanType, ObjectUtils.arrayToList(DBColumn.class,
(DBColumn[])keyColumns), selectColumns);
}
+ @Override
+ public Class<?> getBeanType()
+ {
+ return constructor.getDeclaringClass();
+ }
+
@Override
public void prepareQuery(DBCommandExpr cmd, DBContext context)
{