/* * 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.test.lob; import java.util.List; import org.junit.Test; import org.hibernate.Session; import org.hibernate.dialect.Oracle8iDialect; import org.hibernate.dialect.SybaseASE15Dialect; import org.hibernate.query.Query; import org.hibernate.testing.SkipForDialect; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.hibernate.testing.transaction.TransactionUtil; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; /** * Tests eager materialization and mutation of long strings. * * @author Steve Ebersole */ @SuppressWarnings( {"UnusedDeclaration"}) public abstract class LongStringTest extends BaseCoreFunctionalTestCase { private static final int LONG_STRING_SIZE = 10000; private static final String EMPTY = ""; private final String original = buildRecursively( LONG_STRING_SIZE, 'x' ); private final String changed = buildRecursively( LONG_STRING_SIZE, 'y' ); @Test public void testBoundedLongStringAccess() { Session s = openSession(); s.beginTransaction(); LongStringHolder entity = new LongStringHolder(); s.save( entity ); s.getTransaction().commit(); s.close(); s = openSession(); s.beginTransaction(); entity = s.get( LongStringHolder.class, entity.getId() ); assertNull( entity.getLongString() ); entity.setLongString( original ); s.getTransaction().commit(); s.close(); s = openSession(); s.beginTransaction(); entity = s.get( LongStringHolder.class, entity.getId() ); assertEquals( LONG_STRING_SIZE, entity.getLongString().length() ); assertEquals( original, entity.getLongString() ); entity.setLongString( changed ); s.getTransaction().commit(); s.close(); s = openSession(); s.beginTransaction(); entity = s.get( LongStringHolder.class, entity.getId() ); assertEquals( LONG_STRING_SIZE, entity.getLongString().length() ); assertEquals( changed, entity.getLongString() ); entity.setLongString( null ); s.getTransaction().commit(); s.close(); s = openSession(); s.beginTransaction(); entity = s.get( LongStringHolder.class, entity.getId() ); assertNull( entity.getLongString() ); entity.setLongString( EMPTY ); s.getTransaction().commit(); s.close(); s = openSession(); s.beginTransaction(); entity = s.get( LongStringHolder.class, entity.getId() ); if ( entity.getLongString() != null ) { if(getDialect() instanceof SybaseASE15Dialect){ //Sybase uses a single blank to denote an EMPTY string (this is by design). So, when inserting an EMPTY string '', it is interpreted as single blank ' '. assertEquals( EMPTY.length(), entity.getLongString().trim().length() ); assertEquals( EMPTY, entity.getLongString().trim() ); }else{ assertEquals( EMPTY.length(), entity.getLongString().length() ); assertEquals( EMPTY, entity.getLongString() ); } } s.delete( entity ); s.getTransaction().commit(); s.close(); } @Test @SkipForDialect(Oracle8iDialect.class) @TestForIssue( jiraKey = "HHH-11477") public void testUsingLobPropertyInHqlQuery() { TransactionUtil.doInHibernate( this::sessionFactory, session -> { LongStringHolder entity = new LongStringHolder(); entity.setLongString( original ); session.save( entity ); } ); TransactionUtil.doInHibernate( this::sessionFactory, session -> { final Query query = session.createQuery( "from LongStringHolder where longString = :stringValue" ); query.setParameter( "stringValue", original ); final List<LongStringHolder> results = query.list(); assertThat( results.size(), is( 1 ) ); assertThat( results.get( 0 ).getLongString(), is( original ) ); } ); } @Test @SkipForDialect(Oracle8iDialect.class) @TestForIssue( jiraKey = "HHH-11477") public void testSelectLobPropertyInHqlQuery() { TransactionUtil.doInHibernate( this::sessionFactory, session -> { LongStringHolder entity = new LongStringHolder(); entity.setLongString( original ); session.save( entity ); } ); TransactionUtil.doInHibernate( this::sessionFactory, session -> { final Query query = session.createQuery( "select l.longString from LongStringHolder l where l.longString = :stringValue" ); query.setParameter( "stringValue", original ); final List<String> results = query.list(); assertThat( results.size(), is( 1 ) ); assertThat( results.get( 0 ), is( original ) ); } ); } @Override protected boolean isCleanupTestDataRequired() { return true; } private String buildRecursively(int size, char baseChar) { StringBuilder buff = new StringBuilder(); for( int i = 0; i < size; i++ ) { buff.append( baseChar ); } return buff.toString(); } }