diff --git a/base/src/org/compiere/model/Query.java b/base/src/org/compiere/model/Query.java index f01e4905f8..6ac2d34099 100644 --- a/base/src/org/compiere/model/Query.java +++ b/base/src/org/compiere/model/Query.java @@ -506,37 +506,46 @@ public class Query * Get a Array with the IDs for this Query * @return Get a Array with the IDs */ - public int[] getIDs () { + String[] keys = table.getKeyColumns(); + if (keys.length != 1) + { + throw new DBException("Table "+table+" has 0 or more than 1 key columns"); + } + + StringBuffer selectClause = new StringBuffer("SELECT "); + selectClause.append(keys[0]); + selectClause.append(" FROM ").append(table.getTableName()); + String sql = buildSQL(selectClause, true); ArrayList list = new ArrayList(); - StringBuffer sql = new StringBuffer("SELECT "); - sql.append(table.getTableName()).append("_ID FROM ").append(table.getTableName()); - if (whereClause != null && whereClause.length() > 0) - sql.append(" WHERE ").append(whereClause); PreparedStatement pstmt = null; ResultSet rs = null; try { - pstmt = DB.prepareStatement(sql.toString(), trxName); + pstmt = DB.prepareStatement(sql, trxName); rs = createResultSet(pstmt); while (rs.next()) - list.add(new Integer(rs.getInt(1))); + { + list.add(rs.getInt(1)); + } } catch (SQLException e) { - log.log(Level.SEVERE, sql.toString(), e); - return null; + throw new DBException(e, sql); } - finally { + finally + { DB.close(rs, pstmt); rs = null; pstmt = null; } // Convert to array int[] retValue = new int[list.size()]; for (int i = 0; i < retValue.length; i++) - retValue[i] = ((Integer)list.get(i)).intValue(); + { + retValue[i] = list.get(i); + } return retValue; } // get_IDs diff --git a/extend/src/test/functional/QueryTest.java b/extend/src/test/functional/QueryTest.java index 61157957ad..d4010b8caa 100644 --- a/extend/src/test/functional/QueryTest.java +++ b/extend/src/test/functional/QueryTest.java @@ -11,6 +11,7 @@ import org.compiere.model.MTable; import org.compiere.model.POResultSet; import org.compiere.model.Query; import org.compiere.util.DB; +import org.compiere.util.Env; import test.AdempiereTestCase; @@ -170,4 +171,30 @@ public class QueryTest extends AdempiereTestCase } assertNotNull("Exception should be throwed", ex); } + + public void testSetClient_ID() throws Exception + { + int AD_Client_ID = Env.getAD_Client_ID(getCtx()); + String sql = "SELECT COUNT(*) FROM C_Invoice WHERE IsActive='Y' AND AD_Client_ID="+AD_Client_ID; + int targetCount = DB.getSQLValue(null, sql); + // + int count = new Query(getCtx(), "C_Invoice", "1=1", getTrxName()) + .setOnlyActiveRecords(true) + .setClient_ID() + .count(); + assertEquals("Invoice # not match", targetCount, count); + } + + public void testGet_IDs() throws Exception + { + final String whereClause = "AD_Element_ID IN (101, 102)"; + int[] ids = new Query(getCtx(), "AD_Element", whereClause, getTrxName()) + .setOrderBy("AD_Element_ID") + .getIDs(); + assertNotNull(ids); + assertEquals(2, ids.length); + assertEquals(101, ids[0]); + assertEquals(102, ids[1]); + } + }