You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by da...@apache.org on 2015/06/08 22:27:45 UTC

deltaspike git commit: DELTASPIKE-894 Trim for CriteriaSupport API

Repository: deltaspike
Updated Branches:
  refs/heads/master e0f976181 -> 8ed97fb72


DELTASPIKE-894 Trim for CriteriaSupport API


Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/8ed97fb7
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/8ed97fb7
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/8ed97fb7

Branch: refs/heads/master
Commit: 8ed97fb72962cd5eabf50526ef80447cae2db3cd
Parents: e0f9761
Author: Daniel Cunha (soro) <da...@apache.org>
Authored: Mon Jun 8 17:26:12 2015 -0300
Committer: Daniel Cunha (soro) <da...@apache.org>
Committed: Mon Jun 8 17:26:16 2015 -0300

----------------------------------------------------------------------
 .../data/api/criteria/CriteriaSupport.java      | 101 +++++++++++++------
 .../impl/criteria/selection/strings/Trim.java   |  52 ++++++++++
 .../impl/handler/CriteriaSupportHandler.java    |  15 +++
 .../data/impl/criteria/CriteriaTest.java        |  16 +++
 .../test/service/SimpleCriteriaRepository.java  |  55 ++++++----
 5 files changed, 190 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/8ed97fb7/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/criteria/CriteriaSupport.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/criteria/CriteriaSupport.java b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/criteria/CriteriaSupport.java
index fa8ea2c..5d8288f 100644
--- a/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/criteria/CriteriaSupport.java
+++ b/deltaspike/modules/data/api/src/main/java/org/apache/deltaspike/data/api/criteria/CriteriaSupport.java
@@ -18,48 +18,52 @@
  */
 package org.apache.deltaspike.data.api.criteria;
 
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.JoinType;
+import javax.persistence.metamodel.SingularAttribute;
 import java.sql.Date;
 import java.sql.Time;
 import java.sql.Timestamp;
 
-import javax.persistence.criteria.JoinType;
-import javax.persistence.metamodel.SingularAttribute;
-
 /**
  * Interface to be added to a repository for criteria support.
  *
- * @param <E>   Entity type.
+ * @param <E> Entity type.
  */
 public interface CriteriaSupport<E>
 {
 
     /**
      * Create a {@link Criteria} instance.
-     * @return          Criteria instance related to the Repository entity class.
+     *
+     * @return Criteria instance related to the Repository entity class.
      */
     Criteria<E, E> criteria();
 
     /**
      * Create a {@link Criteria} instance.
-     * @param <T>       Type related to the current criteria class.
-     * @param clazz     Class other than the current entity class.
-     * @return          Criteria instance related to a join type of the current entity class.
+     *
+     * @param <T>   Type related to the current criteria class.
+     * @param clazz Class other than the current entity class.
+     * @return Criteria instance related to a join type of the current entity class.
      */
     <T> Criteria<T, T> where(Class<T> clazz);
 
     /**
      * Create a {@link Criteria} instance with a join type.
-     * @param <T>       Type related to the current criteria class.
-     * @param clazz     Class other than the current entity class.
-     * @param joinType  Join type to apply.
-     * @return          Criteria instance related to a join type of the current entity class.
+     *
+     * @param <T>      Type related to the current criteria class.
+     * @param clazz    Class other than the current entity class.
+     * @param joinType Join type to apply.
+     * @return Criteria instance related to a join type of the current entity class.
      */
     <T> Criteria<T, T> where(Class<T> clazz, JoinType joinType);
 
     /**
      * Create a query selection for an Entity attribute.
+     *
      * @param attribute Attribute to show up in the result selection
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     <X> QuerySelection<E, X> attribute(SingularAttribute<? super E, X> attribute);
 
@@ -67,8 +71,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#abs(javax.persistence.criteria.Expression)}
      * over an attribute.
+     *
      * @param attribute Attribute to use in the aggregate.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     <N extends Number> QuerySelection<E, N> abs(SingularAttribute<? super E, N> attribute);
 
@@ -76,8 +81,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#avg(javax.persistence.criteria.Expression)}
      * over an attribute.
+     *
      * @param attribute Attribute to use in the aggregate.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     <N extends Number> QuerySelection<E, N> avg(SingularAttribute<? super E, N> attribute);
 
@@ -85,8 +91,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#count(javax.persistence.criteria.Expression)}
      * over an attribute.
+     *
      * @param attribute Attribute to use in the aggregate.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, Long> count(SingularAttribute<? super E, ?> attribute);
 
@@ -94,8 +101,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#countDistinct(javax.persistence.criteria.Expression)}
      * over an attribute.
+     *
      * @param attribute Attribute to use in the aggregate.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, Long> countDistinct(SingularAttribute<? super E, ?> attribute);
 
@@ -103,8 +111,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#max(javax.persistence.criteria.Expression)}
      * over an attribute.
+     *
      * @param attribute Attribute to use in the aggregate.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     <N extends Number> QuerySelection<E, N> max(SingularAttribute<? super E, N> attribute);
 
@@ -112,8 +121,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#min(javax.persistence.criteria.Expression)}
      * over an attribute.
+     *
      * @param attribute Attribute to use in the aggregate.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     <N extends Number> QuerySelection<E, N> min(SingularAttribute<? super E, N> attribute);
 
@@ -121,8 +131,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#neg(javax.persistence.criteria.Expression)}
      * over an attribute.
+     *
      * @param attribute Attribute to use in the aggregate.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     <N extends Number> QuerySelection<E, N> neg(SingularAttribute<? super E, N> attribute);
 
@@ -130,8 +141,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#sum(javax.persistence.criteria.Expression)}
      * over an attribute.
+     *
      * @param attribute Attribute to use in the aggregate.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     <N extends Number> QuerySelection<E, N> sum(SingularAttribute<? super E, N> attribute);
 
@@ -139,9 +151,10 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#mod(javax.persistence.criteria.Expression, Integer)}
      * for an attribute.
+     *
      * @param attribute Attribute to use in the aggregate.
      * @param modulo    Modulo what.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, Integer> modulo(SingularAttribute<? super E, Integer> attribute, Integer modulo);
 
@@ -149,8 +162,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#upper(javax.persistence.criteria.Expression)}
      * over a String attribute.
+     *
      * @param attribute Attribute to uppercase.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, String> upper(SingularAttribute<? super E, String> attribute);
 
@@ -158,8 +172,9 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#lower(javax.persistence.criteria.Expression)}
      * over a String attribute.
+     *
      * @param attribute Attribute to lowercase.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, String> lower(SingularAttribute<? super E, String> attribute);
 
@@ -167,9 +182,10 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#substring(javax.persistence.criteria.Expression, int)}
      * over a String attribute.
+     *
      * @param attribute Attribute to create a substring from.
      * @param from      Substring start.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, String> substring(SingularAttribute<? super E, String> attribute, int from);
 
@@ -177,28 +193,55 @@ public interface CriteriaSupport<E>
      * Create a query selection for the
      * {@link javax.persistence.criteria.CriteriaBuilder#substring(javax.persistence.criteria.Expression, int, int)}
      * over a String attribute.
+     *
      * @param attribute Attribute to create a substring from.
      * @param from      Substring start.
      * @param length    Substring length.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, String> substring(SingularAttribute<? super E, String> attribute, int from, int length);
 
     /**
+     * Create a query selection for the
+     * {@link javax.persistence.criteria.CriteriaBuilder#trim(javax.persistence.criteria.Expression)}
+     * over a String attribute.
+     *
+     * @param attribute Attribute to apply trim.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     */
+    QuerySelection<E, String> trim(SingularAttribute<? super E, String> attribute);
+
+    /**
+     * Create a query selection for the
+     * {@link javax.persistence.criteria.CriteriaBuilder#trim(javax.persistence.criteria.CriteriaBuilder.Trimspec,
+     * javax.persistence.criteria.Expression)}
+     * over a String attribute.
+     *
+     * @param trimspec  Used to specify how strings are trimmed.
+     * @param attribute Attribute to apply trim.
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     */
+    QuerySelection<E, String> trim(CriteriaBuilder.Trimspec trimspec, SingularAttribute<? super E, String> attribute);
+
+
+    /**
      * Create a query selection for the {@link javax.persistence.criteria.CriteriaBuilder#currentDate()}.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     *
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, Date> currDate();
 
     /**
      * Create a query selection for the {@link javax.persistence.criteria.CriteriaBuilder#currentTime()}.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     *
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, Time> currTime();
 
     /**
      * Create a query selection for the {@link javax.persistence.criteria.CriteriaBuilder#currentTimestamp()}.
-     * @return          {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
+     *
+     * @return {@link QuerySelection} part of a {@link Criteria#select(Class, QuerySelection...)} call.
      */
     QuerySelection<E, Timestamp> currTStamp();
 

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/8ed97fb7/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/selection/strings/Trim.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/selection/strings/Trim.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/selection/strings/Trim.java
new file mode 100644
index 0000000..8bb4401
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/criteria/selection/strings/Trim.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.deltaspike.data.impl.criteria.selection.strings;
+
+import org.apache.deltaspike.data.impl.criteria.selection.SingularAttributeSelection;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Path;
+import javax.persistence.criteria.Selection;
+import javax.persistence.metamodel.SingularAttribute;
+
+public class Trim<P> extends SingularAttributeSelection<P, String>
+{
+
+    private final CriteriaBuilder.Trimspec trimspec;
+
+
+    public Trim(SingularAttribute<? super P, String> attribute)
+    {
+        super(attribute);
+        this.trimspec = CriteriaBuilder.Trimspec.BOTH;
+    }
+
+    public Trim(CriteriaBuilder.Trimspec trimspec, SingularAttribute<? super P, String> attribute)
+    {
+        super(attribute);
+        this.trimspec = trimspec;
+    }
+
+    @Override
+    public <R> Selection<String> toSelection(CriteriaQuery<R> query, CriteriaBuilder builder, Path<? extends P> path)
+    {
+        return builder.trim(this.trimspec, path.get(getAttribute()));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/8ed97fb7/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CriteriaSupportHandler.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CriteriaSupportHandler.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CriteriaSupportHandler.java
index 91c3ebc..b4eaf6d 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CriteriaSupportHandler.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CriteriaSupportHandler.java
@@ -23,6 +23,7 @@ import java.sql.Time;
 import java.sql.Timestamp;
 
 import javax.enterprise.context.Dependent;
+import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.JoinType;
 import javax.persistence.metamodel.SingularAttribute;
 
@@ -43,6 +44,7 @@ import org.apache.deltaspike.data.impl.criteria.selection.numeric.Sum;
 import org.apache.deltaspike.data.impl.criteria.selection.strings.Lower;
 import org.apache.deltaspike.data.impl.criteria.selection.strings.SubstringFrom;
 import org.apache.deltaspike.data.impl.criteria.selection.strings.SubstringFromTo;
+import org.apache.deltaspike.data.impl.criteria.selection.strings.Trim;
 import org.apache.deltaspike.data.impl.criteria.selection.strings.Upper;
 import org.apache.deltaspike.data.impl.criteria.selection.temporal.CurrentDate;
 import org.apache.deltaspike.data.impl.criteria.selection.temporal.CurrentTime;
@@ -162,6 +164,19 @@ public class CriteriaSupportHandler<E> extends AbstractDelegateQueryHandler<E> i
         return new SubstringFromTo<E>(attribute, from, length);
     }
 
+    @Override
+    public QuerySelection<E, String> trim(SingularAttribute<? super E, String> attribute)
+    {
+        return new Trim<E>(attribute);
+    }
+
+    @Override
+    public QuerySelection<E, String> trim(CriteriaBuilder.Trimspec trimspec,
+                                          SingularAttribute<? super E, String> attribute)
+    {
+        return new Trim<E>(trimspec, attribute);
+    }
+
     // ----------------------------------------------------------------------------
     // TEMPORAL QUERY SELECTION
     // ----------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/8ed97fb7/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
index 3a459ff..1461fea 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
@@ -435,6 +435,22 @@ public class CriteriaTest extends TransactionalTestCase
         assertEquals(new Integer(1), orderByNameAndCounter.get(1).getCounter());
     }
 
+    @Test
+    public void should_apply_trim()
+    {
+        // given
+        final String name = " should_apply_trim ";
+        createSimple(name, 10);
+
+        // when
+        Object[] objects = repo.queryWithSelectAttributesAndTrim(name);
+        assertNotNull(objects);
+        assertEquals(name, objects[0]);
+        assertEquals(name.trim(), objects[1]);
+        assertEquals("should_apply_trim ", objects[2]);
+    }
+
+
     @Override
     protected EntityManager getEntityManager()
     {

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/8ed97fb7/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java
index 5273cf2..480814e 100644
--- a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/test/service/SimpleCriteriaRepository.java
@@ -28,6 +28,8 @@ import org.apache.deltaspike.data.test.domain.Simple;
 import org.apache.deltaspike.data.test.domain.Simple_;
 import org.apache.deltaspike.data.test.domain.SuperSimple_;
 
+import javax.persistence.criteria.CriteriaBuilder;
+
 @Repository
 @SuppressWarnings("unchecked")
 public abstract class SimpleCriteriaRepository extends AbstractEntityRepository<Simple, Long>
@@ -47,13 +49,13 @@ public abstract class SimpleCriteriaRepository extends AbstractEntityRepository<
     {
         return criteria()
                 .or(
-                    criteria()
-                        .eqIgnoreCase(Simple_.name, name)
-                        .notEqIgnoreCase(Simple_.name, nameLike),
-                    criteria()
-                        .likeIgnoreCase(Simple_.name, nameLike)
-                        .notLikeIgnoreCase(Simple_.name, name)
-                 )
+                        criteria()
+                                .eqIgnoreCase(Simple_.name, name)
+                                .notEqIgnoreCase(Simple_.name, nameLike),
+                        criteria()
+                                .likeIgnoreCase(Simple_.name, nameLike)
+                                .notLikeIgnoreCase(Simple_.name, name)
+                )
                 .getResultList();
     }
 
@@ -71,17 +73,19 @@ public abstract class SimpleCriteriaRepository extends AbstractEntityRepository<
                 .getAnyResult();
     }
 
-    public List<Simple> findByTimeBetween(Date from, Date to) {
+    public List<Simple> findByTimeBetween(Date from, Date to)
+    {
         return criteria()
-                 .gt(Simple_.temporal, from)
-                 .lt(Simple_.temporal, to)
-                 .getResultList();
+                .gt(Simple_.temporal, from)
+                .lt(Simple_.temporal, to)
+                .getResultList();
     }
 
-    public Simple findBySuperName(String superName) {
+    public Simple findBySuperName(String superName)
+    {
         return criteria()
-                 .eq(SuperSimple_.superName, superName)
-                 .getSingleResult();
+                .eq(SuperSimple_.superName, superName)
+                .getSingleResult();
     }
 
     public Long criteriaCount(String name)
@@ -121,11 +125,22 @@ public abstract class SimpleCriteriaRepository extends AbstractEntityRepository<
                 .getResultList();
     }
 
-   public List<Simple> findOrderByNameAndCounter() {
-      return criteria()
-              .orderDesc(Simple_.counter)
-              .orderAsc(Simple_.name)
-              .getResultList();
-   }
+    public List<Simple> findOrderByNameAndCounter()
+    {
+        return criteria()
+                .orderDesc(Simple_.counter)
+                .orderAsc(Simple_.name)
+                .getResultList();
+    }
+
+    public Object[] queryWithSelectAttributesAndTrim(String name)
+    {
+        return criteria()
+                .select(attribute(Simple_.name), trim(Simple_.name),
+                        trim(CriteriaBuilder.Trimspec.LEADING, Simple_.name))
+                .eq(Simple_.name, name)
+                .createQuery()
+                .getSingleResult();
+    }
 
 }