diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExample.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExample.java new file mode 100644 index 0000000000..69aaaae19d --- /dev/null +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExample.java @@ -0,0 +1,47 @@ +package com.baeldung.hibernate.scalarmethod; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.type.StandardBasicTypes; + +public class HibernateScalarExample { + + private Session session; + + public HibernateScalarExample(Session session) { + this.session = session; + } + + public List fetchColumnWithNativeQuery() { + return session.createNativeQuery("SELECT * FROM Student student") + .list(); + } + + public List fetchColumnWithScalar() { + return session.createNativeQuery("SELECT * FROM Student student") + .addScalar("studentId", StandardBasicTypes.LONG) + .addScalar("name", StandardBasicTypes.STRING) + .addScalar("age", StandardBasicTypes.INTEGER) + .list(); + } + + public List fetchLimitedColumnWithScalar() { + return session.createNativeQuery("SELECT * FROM Student student") + .addScalar("name", StandardBasicTypes.STRING) + .list(); + } + + public List fetchColumnWithOverloadedScalar() { + return session.createNativeQuery("SELECT * FROM Student student") + .addScalar("name", StandardBasicTypes.STRING) + .addScalar("age") + .list(); + } + + public Integer fetchAvgAgeWithScalar() { + return (Integer) session.createNativeQuery("SELECT AVG(age) as avgAge FROM Student student") + .addScalar("avgAge") + .uniqueResult(); + } +} diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExampleUnitTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExampleUnitTest.java new file mode 100644 index 0000000000..ca01c5cb84 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExampleUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.hibernate.scalarmethod; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.List; +import java.util.Random; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.hibernate.HibernateUtil; +import com.baeldung.hibernate.pojo.Student; + +public class HibernateScalarExampleUnitTest { + + private static Session session; + private static Transaction transaction; + private static final int DATA_SIZE = 50000; + private static HibernateScalarExample scalarExample; + + @BeforeClass + public static void setUp() throws IOException { + session = HibernateUtil.getSessionFactory().openSession(); + transaction = session.beginTransaction(); + scalarExample = new HibernateScalarExample(session); + session.createNativeQuery("delete from Student").executeUpdate(); + for (int i = 0; i < DATA_SIZE; i++) { + Student student = new Student("John-" + i, generateRandomAge(5, 24)); + session.persist(student); + } + transaction.commit(); + transaction = session.beginTransaction(); + } + + @AfterClass + public static void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenNativeQuery_whenNoScalarUsed_ThenFetchAll() { + List list = scalarExample.fetchColumnWithNativeQuery(); + assertEquals(DATA_SIZE, list.size()); + } + + @Test + public void givenNativeQuery_whenScalarUsed_ThenFetchAll() { + List list = scalarExample.fetchColumnWithScalar(); + assertEquals(DATA_SIZE, list.size()); + } + + @Test + public void givenNativeQuery_whenScalarUsed_ThenFetchLimitedColumns() { + List list = scalarExample.fetchLimitedColumnWithScalar(); + for (String colValue : list) { + assertTrue(colValue.startsWith("John")); + } + } + + @Test + public void givenNativeQuery_whenScalarUsedForSingleResult_ThenSingleValueReturned() { + List list = scalarExample.fetchColumnWithOverloadedScalar(); + for (Object[] colArray : list) { + assertEquals(2, colArray.length); + } + } + + @Test + public void whenScalarUsedForAvgAge_ThenSingleValueReturned() { + Integer avgAge = scalarExample.fetchAvgAgeWithScalar(); + assertEquals(true, (avgAge >= 5 && avgAge <= 24)); + } + + private static int generateRandomAge(int min, int max) { + return new Random().nextInt(max - min + 1) + min; + } +}