Search in sources :

Example 1 with NamedParameterContext

use of org.hibernate.loader.plan.exec.query.spi.NamedParameterContext in project hibernate-orm by hibernate.

the class EncapsulatedCompositeAttributeResultSetProcessorTest method getResults.

private List<?> getResults(EntityPersister entityPersister) {
    final LoadPlan plan = Helper.INSTANCE.buildLoadPlan(sessionFactory(), entityPersister);
    final LoadQueryDetails queryDetails = Helper.INSTANCE.buildLoadQueryDetails(plan, sessionFactory());
    final String sql = queryDetails.getSqlStatement();
    final ResultSetProcessor resultSetProcessor = queryDetails.getResultSetProcessor();
    final List results = new ArrayList();
    final Session workSession = openSession();
    workSession.beginTransaction();
    workSession.doWork(new Work() {

        @Override
        public void execute(Connection connection) throws SQLException {
            PreparedStatement ps = connection.prepareStatement(sql);
            ps.setInt(1, 1);
            ResultSet resultSet = ps.executeQuery();
            results.addAll(resultSetProcessor.extractResults(resultSet, (SessionImplementor) workSession, new QueryParameters(), new NamedParameterContext() {

                @Override
                public int[] getNamedParameterLocations(String name) {
                    return new int[0];
                }
            }, true, false, null, null));
            resultSet.close();
            ps.close();
        }
    });
    workSession.getTransaction().commit();
    workSession.close();
    return results;
}
Also used : NamedParameterContext(org.hibernate.loader.plan.exec.query.spi.NamedParameterContext) ResultSetProcessor(org.hibernate.loader.plan.exec.process.spi.ResultSetProcessor) SQLException(java.sql.SQLException) ArrayList(java.util.ArrayList) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement) QueryParameters(org.hibernate.engine.spi.QueryParameters) LoadPlan(org.hibernate.loader.plan.spi.LoadPlan) LoadQueryDetails(org.hibernate.loader.plan.exec.spi.LoadQueryDetails) Work(org.hibernate.jdbc.Work) ResultSet(java.sql.ResultSet) ArrayList(java.util.ArrayList) List(java.util.List) Session(org.hibernate.Session)

Example 2 with NamedParameterContext

use of org.hibernate.loader.plan.exec.query.spi.NamedParameterContext in project hibernate-orm by hibernate.

the class EntityAssociationResultSetProcessorTest method testManyToOneEntityProcessing.

@Test
public void testManyToOneEntityProcessing() throws Exception {
    final EntityPersister entityPersister = sessionFactory().getEntityPersister(Message.class.getName());
    // create some test data
    Session session = openSession();
    session.beginTransaction();
    Message message = new Message(1, "the message");
    Poster poster = new Poster(2, "the poster");
    session.save(message);
    session.save(poster);
    message.poster = poster;
    poster.messages.add(message);
    session.getTransaction().commit();
    session.close();
    {
        final LoadPlan plan = Helper.INSTANCE.buildLoadPlan(sessionFactory(), entityPersister);
        final LoadQueryDetails queryDetails = Helper.INSTANCE.buildLoadQueryDetails(plan, sessionFactory());
        final String sql = queryDetails.getSqlStatement();
        final ResultSetProcessor resultSetProcessor = queryDetails.getResultSetProcessor();
        final List results = new ArrayList();
        final Session workSession = openSession();
        workSession.beginTransaction();
        workSession.doWork(new Work() {

            @Override
            public void execute(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(sql);
                ps.setInt(1, 1);
                ResultSet resultSet = ps.executeQuery();
                results.addAll(resultSetProcessor.extractResults(resultSet, (SessionImplementor) workSession, new QueryParameters(), new NamedParameterContext() {

                    @Override
                    public int[] getNamedParameterLocations(String name) {
                        return new int[0];
                    }
                }, true, false, null, null));
                resultSet.close();
                ps.close();
            }
        });
        assertEquals(1, results.size());
        Object result = results.get(0);
        assertNotNull(result);
        Message workMessage = ExtraAssertions.assertTyping(Message.class, result);
        assertEquals(1, workMessage.mid.intValue());
        assertEquals("the message", workMessage.msgTxt);
        assertTrue(Hibernate.isInitialized(workMessage.poster));
        Poster workPoster = workMessage.poster;
        assertEquals(2, workPoster.pid.intValue());
        assertEquals("the poster", workPoster.name);
        assertFalse(Hibernate.isInitialized(workPoster.messages));
        workSession.getTransaction().commit();
        workSession.close();
    }
    // clean up test data
    session = openSession();
    session.beginTransaction();
    session.createQuery("delete Message").executeUpdate();
    session.createQuery("delete Poster").executeUpdate();
    session.getTransaction().commit();
    session.close();
}
Also used : EntityPersister(org.hibernate.persister.entity.EntityPersister) NamedParameterContext(org.hibernate.loader.plan.exec.query.spi.NamedParameterContext) ResultSetProcessor(org.hibernate.loader.plan.exec.process.spi.ResultSetProcessor) ArrayList(java.util.ArrayList) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement) QueryParameters(org.hibernate.engine.spi.QueryParameters) LoadPlan(org.hibernate.loader.plan.spi.LoadPlan) LoadQueryDetails(org.hibernate.loader.plan.exec.spi.LoadQueryDetails) Work(org.hibernate.jdbc.Work) ResultSet(java.sql.ResultSet) SessionImplementor(org.hibernate.engine.spi.SessionImplementor) ArrayList(java.util.ArrayList) List(java.util.List) Session(org.hibernate.Session) Test(org.junit.Test)

Example 3 with NamedParameterContext

use of org.hibernate.loader.plan.exec.query.spi.NamedParameterContext in project hibernate-orm by hibernate.

the class EntityWithNonLazyCollectionResultSetProcessorTest method testEntityWithSet.

@Test
public void testEntityWithSet() throws Exception {
    final EntityPersister entityPersister = sessionFactory().getEntityPersister(Person.class.getName());
    // create some test data
    Session session = openSession();
    session.beginTransaction();
    Person person = new Person();
    person.id = 1;
    person.name = "John Doe";
    person.nickNames.add("Jack");
    person.nickNames.add("Johnny");
    session.save(person);
    session.getTransaction().commit();
    session.close();
    {
        final LoadPlan plan = Helper.INSTANCE.buildLoadPlan(sessionFactory(), entityPersister);
        final LoadQueryDetails queryDetails = Helper.INSTANCE.buildLoadQueryDetails(plan, sessionFactory());
        final String sql = queryDetails.getSqlStatement();
        final ResultSetProcessor resultSetProcessor = queryDetails.getResultSetProcessor();
        final List results = new ArrayList();
        final Session workSession = openSession();
        workSession.beginTransaction();
        workSession.doWork(new Work() {

            @Override
            public void execute(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(sql);
                ps.setInt(1, 1);
                ResultSet resultSet = ps.executeQuery();
                results.addAll(resultSetProcessor.extractResults(resultSet, (SessionImplementor) workSession, new QueryParameters(), new NamedParameterContext() {

                    @Override
                    public int[] getNamedParameterLocations(String name) {
                        return new int[0];
                    }
                }, true, false, null, null));
                resultSet.close();
                ps.close();
            }
        });
        assertEquals(2, results.size());
        Object result1 = results.get(0);
        assertSame(result1, results.get(1));
        assertNotNull(result1);
        Person workPerson = ExtraAssertions.assertTyping(Person.class, result1);
        assertEquals(1, workPerson.id.intValue());
        assertEquals(person.name, workPerson.name);
        assertTrue(Hibernate.isInitialized(workPerson.nickNames));
        assertEquals(2, workPerson.nickNames.size());
        assertEquals(person.nickNames, workPerson.nickNames);
        workSession.getTransaction().commit();
        workSession.close();
    }
    // clean up test data
    session = openSession();
    session.beginTransaction();
    session.delete(person);
    session.getTransaction().commit();
    session.close();
}
Also used : EntityPersister(org.hibernate.persister.entity.EntityPersister) NamedParameterContext(org.hibernate.loader.plan.exec.query.spi.NamedParameterContext) ResultSetProcessor(org.hibernate.loader.plan.exec.process.spi.ResultSetProcessor) ArrayList(java.util.ArrayList) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement) QueryParameters(org.hibernate.engine.spi.QueryParameters) LoadPlan(org.hibernate.loader.plan.spi.LoadPlan) LoadQueryDetails(org.hibernate.loader.plan.exec.spi.LoadQueryDetails) Work(org.hibernate.jdbc.Work) ResultSet(java.sql.ResultSet) SessionImplementor(org.hibernate.engine.spi.SessionImplementor) ArrayList(java.util.ArrayList) List(java.util.List) Session(org.hibernate.Session) Test(org.junit.Test)

Example 4 with NamedParameterContext

use of org.hibernate.loader.plan.exec.query.spi.NamedParameterContext in project hibernate-orm by hibernate.

the class EntityWithNonLazyOneToManySetResultSetProcessorTest method testEntityWithSet.

@Test
public void testEntityWithSet() throws Exception {
    final EntityPersister entityPersister = sessionFactory().getEntityPersister(Poster.class.getName());
    // create some test data
    Session session = openSession();
    session.beginTransaction();
    Poster poster = new Poster();
    poster.pid = 0;
    poster.name = "John Doe";
    Message message1 = new Message();
    message1.mid = 1;
    message1.msgTxt = "Howdy!";
    message1.poster = poster;
    poster.messages.add(message1);
    Message message2 = new Message();
    message2.mid = 2;
    message2.msgTxt = "Bye!";
    message2.poster = poster;
    poster.messages.add(message2);
    session.save(poster);
    session.getTransaction().commit();
    session.close();
    session = openSession();
    session.beginTransaction();
    Poster posterGotten = (Poster) session.get(Poster.class, poster.pid);
    assertEquals(0, posterGotten.pid.intValue());
    assertEquals(poster.name, posterGotten.name);
    assertTrue(Hibernate.isInitialized(posterGotten.messages));
    assertEquals(2, posterGotten.messages.size());
    for (Message message : posterGotten.messages) {
        if (message.mid == 1) {
            assertEquals(message1.msgTxt, message.msgTxt);
        } else if (message.mid == 2) {
            assertEquals(message2.msgTxt, message.msgTxt);
        } else {
            fail("unexpected message id.");
        }
        assertSame(posterGotten, message.poster);
    }
    session.getTransaction().commit();
    session.close();
    {
        final LoadPlan plan = Helper.INSTANCE.buildLoadPlan(sessionFactory(), entityPersister);
        final LoadQueryDetails queryDetails = Helper.INSTANCE.buildLoadQueryDetails(plan, sessionFactory());
        final String sql = queryDetails.getSqlStatement();
        final ResultSetProcessor resultSetProcessor = queryDetails.getResultSetProcessor();
        final List results = new ArrayList();
        final Session workSession = openSession();
        workSession.beginTransaction();
        workSession.doWork(new Work() {

            @Override
            public void execute(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(sql);
                ps.setInt(1, 0);
                ResultSet resultSet = ps.executeQuery();
                results.addAll(resultSetProcessor.extractResults(resultSet, (SessionImplementor) workSession, new QueryParameters(), new NamedParameterContext() {

                    @Override
                    public int[] getNamedParameterLocations(String name) {
                        return new int[0];
                    }
                }, true, false, null, null));
                resultSet.close();
                ps.close();
            }
        });
        assertEquals(2, results.size());
        Object result1 = results.get(0);
        assertNotNull(result1);
        assertSame(result1, results.get(1));
        Poster workPoster = ExtraAssertions.assertTyping(Poster.class, result1);
        assertEquals(0, workPoster.pid.intValue());
        assertEquals(poster.name, workPoster.name);
        assertTrue(Hibernate.isInitialized(workPoster.messages));
        assertEquals(2, workPoster.messages.size());
        assertTrue(Hibernate.isInitialized(posterGotten.messages));
        assertEquals(2, workPoster.messages.size());
        for (Message message : workPoster.messages) {
            if (message.mid == 1) {
                assertEquals(message1.msgTxt, message.msgTxt);
            } else if (message.mid == 2) {
                assertEquals(message2.msgTxt, message.msgTxt);
            } else {
                fail("unexpected message id.");
            }
            assertSame(workPoster, message.poster);
        }
        workSession.getTransaction().commit();
        workSession.close();
    }
    // clean up test data
    session = openSession();
    session.beginTransaction();
    session.delete(poster);
    session.getTransaction().commit();
    session.close();
}
Also used : EntityPersister(org.hibernate.persister.entity.EntityPersister) NamedParameterContext(org.hibernate.loader.plan.exec.query.spi.NamedParameterContext) ResultSetProcessor(org.hibernate.loader.plan.exec.process.spi.ResultSetProcessor) ArrayList(java.util.ArrayList) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement) QueryParameters(org.hibernate.engine.spi.QueryParameters) LoadPlan(org.hibernate.loader.plan.spi.LoadPlan) LoadQueryDetails(org.hibernate.loader.plan.exec.spi.LoadQueryDetails) Work(org.hibernate.jdbc.Work) ResultSet(java.sql.ResultSet) SessionImplementor(org.hibernate.engine.spi.SessionImplementor) ArrayList(java.util.ArrayList) List(java.util.List) Session(org.hibernate.Session) Test(org.junit.Test)

Example 5 with NamedParameterContext

use of org.hibernate.loader.plan.exec.query.spi.NamedParameterContext in project hibernate-orm by hibernate.

the class AbstractLoadPlanBasedLoader method executeLoad.

protected List executeLoad(SharedSessionContractImplementor session, QueryParameters queryParameters, LoadQueryDetails loadQueryDetails, boolean returnProxies, ResultTransformer forcedResultTransformer, List<AfterLoadAction> afterLoadActions) throws SQLException {
    final PersistenceContext persistenceContext = session.getPersistenceContext();
    final boolean defaultReadOnlyOrig = persistenceContext.isDefaultReadOnly();
    if (queryParameters.isReadOnlyInitialized()) {
        // The read-only/modifiable mode for the query was explicitly set.
        // Temporarily set the default read-only/modifiable setting to the query's setting.
        persistenceContext.setDefaultReadOnly(queryParameters.isReadOnly());
    } else {
        // The read-only/modifiable setting for the query was not initialized.
        // Use the default read-only/modifiable from the persistence context instead.
        queryParameters.setReadOnly(persistenceContext.isDefaultReadOnly());
    }
    persistenceContext.beforeLoad();
    try {
        List results = null;
        final String sql = loadQueryDetails.getSqlStatement();
        SqlStatementWrapper wrapper = null;
        try {
            wrapper = executeQueryStatement(sql, queryParameters, false, afterLoadActions, session);
            results = loadQueryDetails.getResultSetProcessor().extractResults(wrapper.getResultSet(), session, queryParameters, new NamedParameterContext() {

                @Override
                public int[] getNamedParameterLocations(String name) {
                    return AbstractLoadPlanBasedLoader.this.getNamedParameterLocs(name);
                }
            }, returnProxies, queryParameters.isReadOnly(), forcedResultTransformer, afterLoadActions);
        } finally {
            if (wrapper != null) {
                session.getJdbcCoordinator().getResourceRegistry().release(wrapper.getResultSet(), wrapper.getStatement());
                session.getJdbcCoordinator().getResourceRegistry().release(wrapper.getStatement());
                session.getJdbcCoordinator().afterStatementExecution();
            }
            persistenceContext.afterLoad();
        }
        persistenceContext.initializeNonLazyCollections();
        return results;
    } finally {
        // Restore the original default
        persistenceContext.setDefaultReadOnly(defaultReadOnlyOrig);
    }
}
Also used : NamedParameterContext(org.hibernate.loader.plan.exec.query.spi.NamedParameterContext) PersistenceContext(org.hibernate.engine.spi.PersistenceContext) ArrayList(java.util.ArrayList) List(java.util.List)

Aggregations

ArrayList (java.util.ArrayList)10 List (java.util.List)10 NamedParameterContext (org.hibernate.loader.plan.exec.query.spi.NamedParameterContext)10 Connection (java.sql.Connection)9 PreparedStatement (java.sql.PreparedStatement)9 ResultSet (java.sql.ResultSet)9 Session (org.hibernate.Session)9 Work (org.hibernate.jdbc.Work)9 ResultSetProcessor (org.hibernate.loader.plan.exec.process.spi.ResultSetProcessor)9 LoadQueryDetails (org.hibernate.loader.plan.exec.spi.LoadQueryDetails)9 LoadPlan (org.hibernate.loader.plan.spi.LoadPlan)9 QueryParameters (org.hibernate.engine.spi.QueryParameters)7 SessionImplementor (org.hibernate.engine.spi.SessionImplementor)6 EntityPersister (org.hibernate.persister.entity.EntityPersister)6 Test (org.junit.Test)6 SQLException (java.sql.SQLException)3 PersistenceContext (org.hibernate.engine.spi.PersistenceContext)1