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)
     {

Reply via email to