From f18bb88f4b6e879cc69af1c780a47ef36113271b Mon Sep 17 00:00:00 2001 From: hengsin Date: Fri, 28 Apr 2023 18:16:13 +0800 Subject: [PATCH] IDEMPIERE-5691 Add Table Direct type joint method to Query (#1802) --- .../src/org/compiere/model/Query.java | 13 +++++++++++++ .../src/org/idempiere/test/base/QueryTest.java | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/org.adempiere.base/src/org/compiere/model/Query.java b/org.adempiere.base/src/org/compiere/model/Query.java index 6d6eafd5d8..07212a1cf7 100644 --- a/org.adempiere.base/src/org/compiere/model/Query.java +++ b/org.adempiere.base/src/org/compiere/model/Query.java @@ -290,6 +290,19 @@ public class Query return this; } + /** + * Convenient method to add table direct type of joint.
+ * For e.g, if foreignTableName is C_BPartner and TableName for Query is AD_User,
+ * this will add join clause of
+ * "INNER JOIN C_BPartner ON (AD_User.C_BPartner_ID=C_BPartner.C_BParner_ID)". + * @param foreignTableName + */ + public void addTableDirectJoin(String foreignTableName) { + String foreignId = foreignTableName + "_ID"; + addJoinClause("INNER JOIN " + foreignTableName + " ON (" + table.getTableName() + "." + foreignId + + "=" + foreignTableName + "." + foreignId + ")"); + } + /** * Return a list of all po that match the query criteria. * @return List diff --git a/org.idempiere.test/src/org/idempiere/test/base/QueryTest.java b/org.idempiere.test/src/org/idempiere/test/base/QueryTest.java index 85756f3b4a..f62e6f6359 100644 --- a/org.idempiere.test/src/org/idempiere/test/base/QueryTest.java +++ b/org.idempiere.test/src/org/idempiere/test/base/QueryTest.java @@ -48,6 +48,7 @@ import org.compiere.model.MPInstance; import org.compiere.model.MProcess; import org.compiere.model.MTable; import org.compiere.model.MTest; +import org.compiere.model.MUser; import org.compiere.model.PO; import org.compiere.model.POResultSet; import org.compiere.model.Query; @@ -56,6 +57,7 @@ import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.KeyNamePair; import org.idempiere.test.AbstractTestCase; +import org.idempiere.test.DictionaryIDs; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -421,4 +423,15 @@ public class QueryTest extends AbstractTestCase { assertEquals(expected, testRecord.getTestVirtualQty().setScale(2, RoundingMode.HALF_UP), "Wrong value returned"); } + @Test + public void testTableDirectJoin() { + Query query = new Query(Env.getCtx(), MUser.Table_Name, MUser.COLUMNNAME_AD_User_ID + "=?", getTrxName()); + query.addTableDirectJoin("C_BPartner"); + query.setParameters(DictionaryIDs.AD_User.GARDEN_USER.id); + MUser user = query.first(); + assertNotNull(user, "Failed to retrieve garden user record"); + + String sql = query.getSQL(); + assertTrue(sql.toLowerCase().contains("inner join c_bpartner on (ad_user.c_bpartner_id=c_bpartner.c_bpartner_id)"), "Unexpected SQL clause generated from query"); + } }