From 0d77accc1bd5a266ab5629a07fb6dbee40dee08c Mon Sep 17 00:00:00 2001 From: "Esser, Jake" Date: Tue, 11 Aug 2026 12:21:56 +0200 Subject: [PATCH 1/2] Add support for distinct queries in Query class --- .../org/javawebstack/orm/query/Query.java | 29 ++++++++++++++++++- .../renderer/MySQLQueryStringRenderer.java | 8 +++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/javawebstack/orm/query/Query.java b/src/main/java/org/javawebstack/orm/query/Query.java index 4e9cb10..76b3a04 100644 --- a/src/main/java/org/javawebstack/orm/query/Query.java +++ b/src/main/java/org/javawebstack/orm/query/Query.java @@ -5,7 +5,6 @@ import org.javawebstack.orm.SQLMapper; import org.javawebstack.orm.connection.pool.PooledSQL; import org.javawebstack.orm.exception.ORMQueryException; -import org.javawebstack.orm.connection.SQL; import org.javawebstack.orm.renderer.SQLQueryString; import java.sql.ResultSet; @@ -31,6 +30,8 @@ public class Query { private QueryGroup having; private boolean applyAccessible = false; private Object accessor; + private boolean distinct = false; + private String distinctColumn = null; public Query(Class model) { this(Repo.get(model), model); @@ -45,6 +46,14 @@ public boolean isWithDeleted() { return withDeleted; } + public boolean isDistinct() { + return distinct; + } + + public String getDistinctColumn() { + return distinctColumn; + } + public boolean shouldApplyAccessible() { return applyAccessible; } @@ -94,6 +103,24 @@ public Query select(String... columns) { return this; } + public Query distinct() { + this.distinct = true; + return this; + } + + public Query distinct(String column) { + this.distinct = true; + this.distinctColumn = column; + return this; + } + + public Query distinct(boolean distinct) { + this.distinct = distinct; + if (!distinct) + this.distinctColumn = null; + return this; + } + public Query and(Function, QueryGroup> group) { where.and(group); return this; diff --git a/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java b/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java index 44ee5c8..8acde32 100644 --- a/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java +++ b/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java @@ -49,6 +49,14 @@ public SQLQueryString buildQuery(Query query) { Repo repo = query.getRepo(); List parameters = new ArrayList<>(); StringBuilder sb = new StringBuilder("SELECT "); + if (query.isDistinct()) { + if (query.getDistinctColumn() != null) { + String col = new QueryColumn(query.getDistinctColumn()).toString(repo.getInfo()); + sb.append("DISTINCT ").append(col).append(", "); + } else { + sb.append("DISTINCT "); + } + } if(query.getSelect().size() == 0) sb.append("*"); else From 31f8c92318b976d9480260375979204e6cb390d5 Mon Sep 17 00:00:00 2001 From: "Esser, Jake" Date: Tue, 11 Aug 2026 12:30:18 +0200 Subject: [PATCH 2/2] Refactor distinct query handling in Query class and MySQLQueryStringRenderer --- src/main/java/org/javawebstack/orm/query/Query.java | 1 + .../orm/renderer/MySQLQueryStringRenderer.java | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/javawebstack/orm/query/Query.java b/src/main/java/org/javawebstack/orm/query/Query.java index 76b3a04..846aca8 100644 --- a/src/main/java/org/javawebstack/orm/query/Query.java +++ b/src/main/java/org/javawebstack/orm/query/Query.java @@ -105,6 +105,7 @@ public Query select(String... columns) { public Query distinct() { this.distinct = true; + this.distinctColumn = null; return this; } diff --git a/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java b/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java index 8acde32..bff240c 100644 --- a/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java +++ b/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java @@ -50,14 +50,15 @@ public SQLQueryString buildQuery(Query query) { List parameters = new ArrayList<>(); StringBuilder sb = new StringBuilder("SELECT "); if (query.isDistinct()) { - if (query.getDistinctColumn() != null) { + sb.append("DISTINCT "); + // Prepend distinctColumn only when no explicit select list is set (i.e. SELECT *). + // With an explicit select list (e.g. count(*)) the column position must not shift. + if (query.getDistinctColumn() != null && query.getSelect().isEmpty()) { String col = new QueryColumn(query.getDistinctColumn()).toString(repo.getInfo()); - sb.append("DISTINCT ").append(col).append(", "); - } else { - sb.append("DISTINCT "); + sb.append(col).append(", "); } } - if(query.getSelect().size() == 0) + if(query.getSelect().isEmpty()) sb.append("*"); else sb.append(String.join(",", query.getSelect()));