[hibernate-commits] Hibernate SVN: r18448 - in core/trunk/entitymanager/src: test/java/org/hibernate/ejb/criteria/basic and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Jan 8 01:10:24 EST 2010


Author: steve.ebersole at jboss.com
Date: 2010-01-08 01:10:24 -0500 (Fri, 08 Jan 2010)
New Revision: 18448

Added:
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/AggregationResultTest.java
Modified:
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/function/AggregationFunction.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Product.java
Log:
HHH-4766 - Properly support criteria notion of SUM aggregation return types


Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/function/AggregationFunction.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/function/AggregationFunction.java	2010-01-08 03:51:47 UTC (rev 18447)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/function/AggregationFunction.java	2010-01-08 06:10:24 UTC (rev 18448)
@@ -131,10 +131,14 @@
 		@SuppressWarnings({ "unchecked" })
 		public SUM(CriteriaBuilderImpl criteriaBuilder, Expression<N> expression) {
 			super( criteriaBuilder, (Class<N>)expression.getJavaType(), NAME , expression);
+			// force the use of a ValueHandler
+			resetJavaType( expression.getJavaType() );
 		}
 
 		public SUM(CriteriaBuilderImpl criteriaBuilder, Expression<? extends Number> expression, Class<N> returnType) {
 			super( criteriaBuilder, returnType, NAME , expression);
+			// force the use of a ValueHandler
+			resetJavaType( returnType );
 		}
 	}
 

Added: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/AggregationResultTest.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/AggregationResultTest.java	                        (rev 0)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/AggregationResultTest.java	2010-01-08 06:10:24 UTC (rev 18448)
@@ -0,0 +1,174 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.ejb.criteria.basic;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+
+import junit.framework.AssertionFailedError;
+
+import org.hibernate.ejb.metamodel.AbstractMetamodelSpecificTest;
+import org.hibernate.ejb.metamodel.Product;
+import org.hibernate.ejb.metamodel.Product_;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class AggregationResultTest extends AbstractMetamodelSpecificTest {
+	private CriteriaBuilder builder;
+
+	@Override
+	public void setUp() {
+		super.setUp();
+		builder = factory.getCriteriaBuilder();
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		Product product = new Product();
+		product.setId( "product1" );
+		product.setPrice( 1.23d );
+		product.setQuantity( 1000 );
+		product.setPartNumber( Integer.MAX_VALUE + 1 );
+		product.setRating( 1.999f );
+		product.setSomeBigInteger( BigInteger.valueOf( 987654321 ) );
+		product.setSomeBigDecimal( BigDecimal.valueOf( 987654.321 ) );
+		em.persist( product );
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	@Override
+	public void tearDown() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		em.createQuery( "delete Product" ).executeUpdate();
+		em.getTransaction().commit();
+		em.close();
+		super.tearDown();
+	}
+
+	/**
+	 * Sum of Longs should return a Long
+	 */
+	public void testSumOfLongs() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaQuery<Long> criteria = builder.createQuery( Long.class );
+		Root<Product> productRoot = criteria.from( Product.class );
+		criteria.select( builder.sum( productRoot.get( Product_.partNumber ) ) );
+		Object sumResult = em.createQuery( criteria ).getSingleResult();
+		assertReturnType( Long.class, sumResult );
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	/**
+	 * Sum of Integers should return an Integer; note that this is distinctly different than JPAQL
+	 */
+	public void testSumOfIntegers() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaQuery<Integer> criteria = builder.createQuery( Integer.class );
+		Root<Product> productRoot = criteria.from( Product.class );
+		criteria.select( builder.sum( productRoot.get( Product_.quantity ) ) );
+		Object sumResult = em.createQuery( criteria ).getSingleResult();
+		assertReturnType( Integer.class, sumResult );
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	/**
+	 * Sum of Doubles should return a Double
+	 */
+	public void testSumOfDoubles() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaQuery<Double> criteria = builder.createQuery( Double.class );
+		Root<Product> productRoot = criteria.from( Product.class );
+		criteria.select( builder.sum( productRoot.get( Product_.price ) ) );
+		Object sumResult = em.createQuery( criteria ).getSingleResult();
+		assertReturnType( Double.class, sumResult );
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	/**
+	 * Sum of Floats should return a Float; note that this is distinctly different than JPAQL
+	 */
+	public void testSumOfFloats() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaQuery<Float> criteria = builder.createQuery( Float.class );
+		Root<Product> productRoot = criteria.from( Product.class );
+		criteria.select( builder.sum( productRoot.get( Product_.rating ) ) );
+		Object sumResult = em.createQuery( criteria ).getSingleResult();
+		assertReturnType( Float.class, sumResult );
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	/**
+	 * Sum of BigInteger should return a BigInteger
+	 */
+	public void testSumOfBigIntegers() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaQuery<BigInteger> criteria = builder.createQuery( BigInteger.class );
+		Root<Product> productRoot = criteria.from( Product.class );
+		criteria.select( builder.sum( productRoot.get( Product_.someBigInteger ) ) );
+		Object sumResult = em.createQuery( criteria ).getSingleResult();
+		assertReturnType( BigInteger.class, sumResult );
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	/**
+	 * Sum of BigDecimal should return a BigDecimal
+	 */
+	public void testSumOfBigDecimals() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaQuery<BigDecimal> criteria = builder.createQuery( BigDecimal.class );
+		Root<Product> productRoot = criteria.from( Product.class );
+		criteria.select( builder.sum( productRoot.get( Product_.someBigDecimal ) ) );
+		Object sumResult = em.createQuery( criteria ).getSingleResult();
+		assertReturnType( BigDecimal.class, sumResult );
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	public void assertReturnType(Class expectedType, Object value) {
+		if ( value != null && ! expectedType.isInstance( value ) ) {
+			throw new AssertionFailedError(
+					"Result value was not of expected type: expected [" + expectedType.getName()
+							+ "] but found [" + value.getClass().getName() + "]"
+			);
+		}
+	}
+}

Modified: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Product.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Product.java	2010-01-08 03:51:47 UTC (rev 18447)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/metamodel/Product.java	2010-01-08 06:10:24 UTC (rev 18448)
@@ -23,6 +23,8 @@
  */
 package org.hibernate.ejb.metamodel;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import javax.persistence.AttributeOverride;
 import javax.persistence.AttributeOverrides;
 import javax.persistence.Column;
@@ -53,8 +55,11 @@
 	private String id;
 	private String name;
 	private double price;
+	private float rating;
 	private int quantity;
 	private long partNumber;
+	private BigInteger someBigInteger;
+	private BigDecimal someBigDecimal;
 	private String wareHouse;
 	private ShelfLife shelfLife;
 
@@ -115,6 +120,30 @@
 		this.partNumber = v;
 	}
 
+	public float getRating() {
+		return rating;
+	}
+
+	public void setRating(float rating) {
+		this.rating = rating;
+	}
+
+	public BigInteger getSomeBigInteger() {
+		return someBigInteger;
+	}
+
+	public void setSomeBigInteger(BigInteger someBigInteger) {
+		this.someBigInteger = someBigInteger;
+	}
+
+	public BigDecimal getSomeBigDecimal() {
+		return someBigDecimal;
+	}
+
+	public void setSomeBigDecimal(BigDecimal someBigDecimal) {
+		this.someBigDecimal = someBigDecimal;
+	}
+
 	@Column(name = "WHOUSE", nullable = true, table = "PRODUCT_DETAILS")
 	public String getWareHouse() {
 		return wareHouse;



More information about the hibernate-commits mailing list