From cb73bb570f9696205586ccfb54cfad170cf5b2b9 Mon Sep 17 00:00:00 2001 From: Szabolcs Hubai Date: Mon, 4 Jan 2021 01:32:27 +0100 Subject: [PATCH 1/6] [#1278] Fix porting of pull request #504 from old_master to master Commit b91659a7a71313e6248cb5eee18e9c7d74f347f7 ("[#878] Add OrderBy support in simplified queries") was never ported to master. The changes from Pull Request #504 touched some parts of it, therefore half of the OrderBy change sneaked in to the "new" master. Fixing by removing the irrelevant OrderBy change. In method findByToJPQL in file framework/src/play/db/jpa/JPQL.java: - old_master merge commit has only StringBuilder related change - master "merge" commit has this OrderBy change too old_master merge commit: b6797a1000ada8b0c54ef86bf8708f370e9ad783 ported master commit: 97c54d292293e58698ba620d7c903d193bedaa32 Fix: 97c54d292293e58698ba620d7c903d193bedaa32 ("Merge pull request #504 from marcelmay/lighthouse-1502-patch") --- framework/src/play/db/jpa/JPQL.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/framework/src/play/db/jpa/JPQL.java b/framework/src/play/db/jpa/JPQL.java index 7f61b9ec30..73054354ea 100644 --- a/framework/src/play/db/jpa/JPQL.java +++ b/framework/src/play/db/jpa/JPQL.java @@ -248,11 +248,7 @@ public String findByToJPQL(String findBy) { public String findByToJPQL(String dbName, String findBy) { findBy = findBy.substring(2); StringBuilder jpql = new StringBuilder(); - String subRequest; - if (findBy.contains("OrderBy")) - subRequest = findBy.split("OrderBy")[0]; - else subRequest = findBy; - String[] parts = subRequest.split("And"); + String[] parts = findBy.split("And"); int index = 1; for (int i = 0; i < parts.length; i++) { String part = parts[i]; From 788cb5a728bc83a9d6f2f49ce9e752e192369a4c Mon Sep 17 00:00:00 2001 From: Loic Descotte Date: Tue, 10 Jan 2012 10:43:44 +0100 Subject: [PATCH 2/6] [#878] Add OrderBy support in simplified queries (cherry picked from commit b91659a7a71313e6248cb5eee18e9c7d74f347f7) --- documentation/manual/jpa.textile | 2 + framework/src/play/db/jpa/JPQL.java | 22 ++++++++- framework/test-src/play/db/jpa/JPQLTest.java | 52 ++++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 framework/test-src/play/db/jpa/JPQLTest.java diff --git a/documentation/manual/jpa.textile b/documentation/manual/jpa.textile index 6c2c08b8c0..0af1b42c41 100644 --- a/documentation/manual/jpa.textile +++ b/documentation/manual/jpa.textile @@ -118,6 +118,8 @@ bc. Post.find("byTitle", "My first post").fetch(); Post.find("byTitleLike", "%hello%").fetch(); Post.find("byAuthorIsNull").fetch(); Post.find("byTitleLikeAndAuthor", "%hello%", connectedUser).fetch(); +Post.find("byTitleOrderByTitle", "%hello%").fetch(); //default for order is asc +Post.find("byTitleOrderByNbCommentsDesc", "%hello%").fetch(); Simple queries follow the following syntax ==[Property][Comparator]And?== where Comparator can be the following: diff --git a/framework/src/play/db/jpa/JPQL.java b/framework/src/play/db/jpa/JPQL.java index 73054354ea..ea4293c682 100644 --- a/framework/src/play/db/jpa/JPQL.java +++ b/framework/src/play/db/jpa/JPQL.java @@ -248,7 +248,11 @@ public String findByToJPQL(String findBy) { public String findByToJPQL(String dbName, String findBy) { findBy = findBy.substring(2); StringBuilder jpql = new StringBuilder(); - String[] parts = findBy.split("And"); + String subRequest; + if (findBy.contains("OrderBy")) + subRequest = findBy.split("OrderBy")[0]; + else subRequest = findBy; + String[] parts = subRequest.split("And"); int index = 1; for (int i = 0; i < parts.length; i++) { String part = parts[i]; @@ -305,6 +309,22 @@ public String findByToJPQL(String dbName, String findBy) { jpql.append(" AND "); } } + // ORDER BY clause + if (findBy.contains("OrderBy")) { + jpql.append(" ORDER BY "); + String orderQuery = findBy.split("OrderBy")[1]; + parts = orderQuery.split("And"); + for (int i = 0; i < parts.length; i++) { + String part = parts[i]; + String orderProp; + if (part.endsWith("Desc")) + orderProp = extractProp(part, "Desc") + " DESC"; + else orderProp = part.toLowerCase(); + if (i > 0) + jpql.append(", "); + jpql.append(orderProp); + } + } return jpql.toString(); } diff --git a/framework/test-src/play/db/jpa/JPQLTest.java b/framework/test-src/play/db/jpa/JPQLTest.java new file mode 100644 index 0000000000..e064fb3092 --- /dev/null +++ b/framework/test-src/play/db/jpa/JPQLTest.java @@ -0,0 +1,52 @@ +package play.db.jpa; + + +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.Properties; +import java.util.Set; + +import static play.db.jpa.JPQL.extractProp; + +import static org.junit.Assert.*; + +public class JPQLTest { + + static JPQL jpql; + + @BeforeClass + public static void setup(){ + jpql = new JPQL(null); + } + + @Test + public void testOrder() { + + String query = "ByNameOrderByName"; + String result = jpql.findByToJPQL(query); + assertTrue(result.endsWith(" ORDER BY name")); + + query = "ByNameOrderByNameAndAge"; + result = jpql.findByToJPQL(query); + assertTrue(result.endsWith(" ORDER BY name, age")); + + query = "ByNameOrderByNameDesc"; + result = jpql.findByToJPQL(query); + assertTrue(result.endsWith(" ORDER BY name DESC")); + + query = "ByNameOrderByNameDescAndAge"; + result = jpql.findByToJPQL(query); + assertTrue(result.endsWith(" ORDER BY name DESC, age")); + + query = "ByNameOrderByNameAndAgeDesc"; + result = jpql.findByToJPQL(query); + assertTrue(result.endsWith(" ORDER BY name, age DESC")); + + query = "ByNameOrderByNameDescAndAgeDesc"; + result = jpql.findByToJPQL(query); + assertTrue(result.endsWith(" ORDER BY name DESC, age DESC")); + + } + +} \ No newline at end of file From 21f59a1572f728b0d855ec2ef7acf342148b9e5c Mon Sep 17 00:00:00 2001 From: Loic Descotte Date: Tue, 13 Mar 2012 17:59:47 +0100 Subject: [PATCH 3/6] [#878] Add OrderBy support in simplified queries : fixes documentation (cherry picked from commit 1e7606189c2048d1a00d210eecb1739c0681da95) --- documentation/manual/jpa.textile | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/documentation/manual/jpa.textile b/documentation/manual/jpa.textile index 0af1b42c41..b8fe48a852 100644 --- a/documentation/manual/jpa.textile +++ b/documentation/manual/jpa.textile @@ -118,10 +118,10 @@ bc. Post.find("byTitle", "My first post").fetch(); Post.find("byTitleLike", "%hello%").fetch(); Post.find("byAuthorIsNull").fetch(); Post.find("byTitleLikeAndAuthor", "%hello%", connectedUser).fetch(); -Post.find("byTitleOrderByTitle", "%hello%").fetch(); //default for order is asc -Post.find("byTitleOrderByNbCommentsDesc", "%hello%").fetch(); +Post.find("byTitleOrderByTitle", "A nice post").fetch(); +Post.find("byTitleOrderByNbCommentsDesc", "A nice post").fetch(); -Simple queries follow the following syntax ==[Property][Comparator]And?== where Comparator can be the following: +Simple queries follow the following syntax ==[Property][Comparator]And?[Orderdirective]?== where Comparator can be the following: * @LessThan@ - less than the given value * @LessThanEquals@ - less than or equal a give value @@ -135,6 +135,11 @@ Simple queries follow the following syntax ==[Property][Comparator]And?==< * @IsNotNull@ - Not a null value (doesn't require an argument) * @IsNull@ - Is a null value (doesn't require an argument) +and Orderdirective can be (for a property named @property@) : + +* @OrderByProperty@ - default ascending order +* @OrderByPropertyDesc@ - descending order + h3. Find using a JPQL query You can use a JPQL query: From 10474d4ccd8b73724a3e2d04a40aafaa96c7303f Mon Sep 17 00:00:00 2001 From: Loic Descotte Date: Sun, 18 Mar 2012 12:44:06 +0100 Subject: [PATCH 4/6] [#878] More OrderBy examples (cherry picked from commit 40dffac35d1307f1b1d078d25671214da14f224d) --- documentation/manual/jpa.textile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/documentation/manual/jpa.textile b/documentation/manual/jpa.textile index b8fe48a852..2aa58f7d1a 100644 --- a/documentation/manual/jpa.textile +++ b/documentation/manual/jpa.textile @@ -135,10 +135,14 @@ Simple queries follow the following syntax ==[Property][Comparator]And?[Or * @IsNotNull@ - Not a null value (doesn't require an argument) * @IsNull@ - Is a null value (doesn't require an argument) -and Orderdirective can be (for a property named @property@) : +and Orderdirective can be (e.g for a property named @name@) : -* @OrderByProperty@ - default ascending order -* @OrderByPropertyDesc@ - descending order +* @OrderByName@ - default ascending order +* @OrderByNameDesc@ - descending order + +you can also use several attributes in Orderdirective : +* @OrderByNameAndAge@ +* @OrderByNameAndAgeDesc@ h3. Find using a JPQL query From d65b177a7a3940bcd83f9396ac85338cb98eefba Mon Sep 17 00:00:00 2001 From: Szabolcs Hubai Date: Mon, 4 Jan 2021 02:35:25 +0100 Subject: [PATCH 5/6] [#1278] Fix test play.db.jpa.JPQLTest [javac] /home/travis/build/playframework/play1/framework/test-src/play/db/jpa/JPQLTest.java:20: error: constructor JPQL in class JPQL cannot be applied to given types; [javac] jpql = new JPQL(null); [javac] ^ [javac] required: no arguments [javac] found: --- framework/test-src/play/db/jpa/JPQLTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/test-src/play/db/jpa/JPQLTest.java b/framework/test-src/play/db/jpa/JPQLTest.java index e064fb3092..a6f037c7e3 100644 --- a/framework/test-src/play/db/jpa/JPQLTest.java +++ b/framework/test-src/play/db/jpa/JPQLTest.java @@ -17,7 +17,7 @@ public class JPQLTest { @BeforeClass public static void setup(){ - jpql = new JPQL(null); + jpql = new JPQL(); } @Test From 2300eaa2754705e370c0838b764b8fa19c7aaf2a Mon Sep 17 00:00:00 2001 From: Alexandre Chatiron Date: Sat, 2 Apr 2022 17:21:24 +0200 Subject: [PATCH 6/6] [#1278] fix formatting --- framework/src/play/db/jpa/JPQL.java | 36 ++++++++++---------- framework/test-src/play/db/jpa/JPQLTest.java | 22 +++++++----- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/framework/src/play/db/jpa/JPQL.java b/framework/src/play/db/jpa/JPQL.java index ea4293c682..73d582069a 100644 --- a/framework/src/play/db/jpa/JPQL.java +++ b/framework/src/play/db/jpa/JPQL.java @@ -240,7 +240,7 @@ public Query bindParameters(Query q, Map params) { } return q; } - + public String findByToJPQL(String findBy) { return findByToJPQL(JPA.DEFAULT, findBy); } @@ -250,7 +250,7 @@ public String findByToJPQL(String dbName, String findBy) { StringBuilder jpql = new StringBuilder(); String subRequest; if (findBy.contains("OrderBy")) - subRequest = findBy.split("OrderBy")[0]; + subRequest = findBy.split("OrderBy")[0]; else subRequest = findBy; String[] parts = subRequest.split("And"); int index = 1; @@ -309,22 +309,22 @@ public String findByToJPQL(String dbName, String findBy) { jpql.append(" AND "); } } - // ORDER BY clause - if (findBy.contains("OrderBy")) { - jpql.append(" ORDER BY "); - String orderQuery = findBy.split("OrderBy")[1]; - parts = orderQuery.split("And"); - for (int i = 0; i < parts.length; i++) { - String part = parts[i]; - String orderProp; - if (part.endsWith("Desc")) - orderProp = extractProp(part, "Desc") + " DESC"; - else orderProp = part.toLowerCase(); - if (i > 0) - jpql.append(", "); - jpql.append(orderProp); - } - } + // ORDER BY clause + if (findBy.contains("OrderBy")) { + jpql.append(" ORDER BY "); + String orderQuery = findBy.split("OrderBy")[1]; + parts = orderQuery.split("And"); + for (int i = 0; i < parts.length; i++) { + String part = parts[i]; + String orderProp; + if (part.endsWith("Desc")) + orderProp = extractProp(part, "Desc") + " DESC"; + else orderProp = part.toLowerCase(); + if (i > 0) + jpql.append(", "); + jpql.append(orderProp); + } + } return jpql.toString(); } diff --git a/framework/test-src/play/db/jpa/JPQLTest.java b/framework/test-src/play/db/jpa/JPQLTest.java index a6f037c7e3..2f1f338661 100644 --- a/framework/test-src/play/db/jpa/JPQLTest.java +++ b/framework/test-src/play/db/jpa/JPQLTest.java @@ -13,16 +13,22 @@ public class JPQLTest { - static JPQL jpql; + static JPQL jpql; - @BeforeClass - public static void setup(){ - jpql = new JPQL(); - } + @BeforeClass + public static void setup(){ + jpql = new JPQL(); + } @Test - public void testOrder() { + public void testFindBy() { + String query = "ByName"; + String result = jpql.findByToJPQL(query); + assertTrue(result.equals("name = ?1")); + } + @Test + public void testOrder() { String query = "ByNameOrderByName"; String result = jpql.findByToJPQL(query); assertTrue(result.endsWith(" ORDER BY name")); @@ -48,5 +54,5 @@ public void testOrder() { assertTrue(result.endsWith(" ORDER BY name DESC, age DESC")); } - -} \ No newline at end of file + +}