diff --git a/src/main/java/org/javawebstack/orm/query/Query.java b/src/main/java/org/javawebstack/orm/query/Query.java index 4e9cb10..846aca8 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,25 @@ public Query select(String... columns) { return this; } + public Query distinct() { + this.distinct = true; + this.distinctColumn = null; + 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..bff240c 100644 --- a/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java +++ b/src/main/java/org/javawebstack/orm/renderer/MySQLQueryStringRenderer.java @@ -49,7 +49,16 @@ public SQLQueryString buildQuery(Query query) { Repo repo = query.getRepo(); List parameters = new ArrayList<>(); StringBuilder sb = new StringBuilder("SELECT "); - if(query.getSelect().size() == 0) + if (query.isDistinct()) { + 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(col).append(", "); + } + } + if(query.getSelect().isEmpty()) sb.append("*"); else sb.append(String.join(",", query.getSelect()));