/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.jpa.test.procedure; import javax.persistence.ColumnResult; import javax.persistence.ConstructorResult; import javax.persistence.Entity; import javax.persistence.EntityManager; import javax.persistence.Id; import javax.persistence.SqlResultSetMapping; import javax.persistence.StoredProcedureQuery; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import java.sql.Connection; import java.sql.SQLException; import java.util.Date; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.dialect.H2Dialect; import org.hibernate.jdbc.Work; import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; import org.junit.Test; import org.hibernate.testing.RequiresDialect; import static org.junit.Assert.assertEquals; /** * @author Steve Ebersole */ @RequiresDialect( H2Dialect.class ) public class StoredProcedureResultSetMappingTest extends BaseEntityManagerFunctionalTestCase { @Entity( name = "Employee" ) @Table( name = "EMP" ) // ignore the questionable-ness of constructing a partial entity @SqlResultSetMapping( name = "id-fname-lname", classes = { @ConstructorResult( targetClass = Employee.class, columns = { @ColumnResult( name = "ID" ), @ColumnResult( name = "FIRSTNAME" ), @ColumnResult( name = "LASTNAME" ) } ) } ) public static class Employee { @Id private int id; private String userName; private String firstName; private String lastName; @Temporal( TemporalType.DATE ) private Date hireDate; public Employee() { } public Employee(Integer id, String firstName, String lastName) { this.id = id; this.firstName = firstName; this.lastName = lastName; } } @Override protected void afterEntityManagerFactoryBuilt() { super.afterEntityManagerFactoryBuilt(); Session s = entityManagerFactory().unwrap( SessionFactory.class ).openSession(); s.doWork( new Work() { @Override public void execute(Connection connection) throws SQLException { connection.createStatement().execute( "CREATE ALIAS allEmployeeNames AS $$\n" + "import org.h2.tools.SimpleResultSet;\n" + "import java.sql.*;\n" + "@CODE\n" + "ResultSet allEmployeeNames() {\n" + " SimpleResultSet rs = new SimpleResultSet();\n" + " rs.addColumn(\"ID\", Types.INTEGER, 10, 0);\n" + " rs.addColumn(\"FIRSTNAME\", Types.VARCHAR, 255, 0);\n" + " rs.addColumn(\"LASTNAME\", Types.VARCHAR, 255, 0);\n" + " rs.addRow(1, \"Steve\", \"Ebersole\");\n" + " rs.addRow(1, \"Jane\", \"Doe\");\n" + " rs.addRow(1, \"John\", \"Doe\");\n" + " return rs;\n" + "}\n" + "$$" ); } } ); s.close(); } @Override public void releaseResources() { Session s = entityManagerFactory().unwrap( SessionFactory.class ).openSession(); s.doWork( new Work() { @Override public void execute(Connection connection) throws SQLException { connection.createStatement().execute( "DROP ALIAS allEmployeeNames IF EXISTS" ); } } ); s.close(); super.releaseResources(); } @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { Employee.class }; } @Test public void testPartialResults() { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); StoredProcedureQuery query = em.createStoredProcedureQuery( "allEmployeeNames", "id-fname-lname" ); List results = query.getResultList(); assertEquals( 3, results.size() ); em.getTransaction().commit(); em.close(); } }