6 - SQM based on JPA type system

This commit is contained in:
Andrea Boriero 2019-07-22 12:14:14 +01:00
parent ec086cd299
commit 944e15ce12
4 changed files with 154 additions and 114 deletions

View File

@ -8,6 +8,11 @@
import java.io.Serializable;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaDelete;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.CriteriaUpdate;
import org.hibernate.procedure.ProcedureCall;
import org.hibernate.query.QueryProducer;
@ -139,4 +144,23 @@ public interface SharedSessionContract extends QueryProducer, Serializable {
* @see org.hibernate.boot.SessionFactoryBuilder#applyJdbcBatchSize
*/
void setJdbcBatchSize(Integer jdbcBatchSize);
/**
* Return an instance of {@link CriteriaBuilder}
*
* @return an instance of CriteriaBuilder
* @throws IllegalStateException if the StatelessSession has been closed
*/
CriteriaBuilder getCriteriaBuilder();
@Override
<T> org.hibernate.query.Query<T> createQuery(String queryString, Class<T> resultType);
<T> org.hibernate.query.Query<T> createQuery(CriteriaQuery<T> criteriaQuery);
org.hibernate.query.Query createQuery(CriteriaUpdate updateQuery);
org.hibernate.query.Query createQuery(CriteriaDelete deleteQuery);
<T> org.hibernate.query.Query<T> createNamedQuery(String name, Class<T> resultType);
}

View File

@ -16,11 +16,10 @@
import java.util.UUID;
import javax.persistence.FlushModeType;
import javax.persistence.TransactionRequiredException;
import javax.persistence.Tuple;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaDelete;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.CriteriaUpdate;
import javax.persistence.criteria.Selection;
import org.hibernate.CacheMode;
import org.hibernate.EmptyInterceptor;
@ -56,7 +55,6 @@
import org.hibernate.engine.transaction.internal.TransactionImpl;
import org.hibernate.engine.transaction.spi.TransactionImplementor;
import org.hibernate.id.uuid.StandardRandomStrategy;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.jpa.internal.util.FlushModeTypeHelper;
import org.hibernate.jpa.spi.NativeQueryTupleTransformer;
import org.hibernate.jpa.spi.TupleBuilderTransformer;
@ -73,9 +71,10 @@
import org.hibernate.query.sql.internal.NativeQueryImpl;
import org.hibernate.query.sql.spi.NamedNativeQueryMemento;
import org.hibernate.query.sql.spi.NativeQueryImplementor;
import org.hibernate.query.sql.spi.ResultSetMappingDescriptor;
import org.hibernate.query.sqm.internal.QuerySqmImpl;
import org.hibernate.query.sqm.tree.SqmStatement;
import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement;
import org.hibernate.query.sqm.tree.update.SqmUpdateStatement;
import org.hibernate.resource.jdbc.spi.JdbcSessionContext;
import org.hibernate.resource.jdbc.spi.StatementInspector;
import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl;
@ -862,6 +861,62 @@ public void setJdbcBatchSize(Integer jdbcBatchSize) {
this.jdbcBatchSize = jdbcBatchSize;
}
@Override
public CriteriaBuilder getCriteriaBuilder() {
checkOpen();
return getFactory().getCriteriaBuilder();
}
@Override
public <T> QueryImplementor<T> createQuery(CriteriaQuery<T> criteriaQuery) {
checkOpen();
try {
return new QuerySqmImpl<>(
"<criteria>",
(SqmStatement) criteriaQuery,
criteriaQuery.getResultType(),
this
);
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Override
public QueryImplementor createQuery(CriteriaUpdate criteriaUpdate) {
checkOpen();
try {
return new QuerySqmImpl<>(
"<criteria>",
(SqmUpdateStatement) criteriaUpdate,
null,
this
);
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Override
public QueryImplementor createQuery(CriteriaDelete criteriaDelete) {
checkOpen();
try {
return new QuerySqmImpl<>(
"<criteria>",
(SqmDeleteStatement) criteriaDelete,
null,
this
);
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@SuppressWarnings("unused")
private void writeObject(ObjectOutputStream oos) throws IOException {
if ( log.isTraceEnabled() ) {

View File

@ -3104,56 +3104,6 @@ public Map<String, Object> getProperties() {
return Collections.unmodifiableMap( properties );
}
@Override
public <T> QueryImplementor<T> createQuery(CriteriaQuery<T> criteriaQuery) {
checkOpen();
try {
return new QuerySqmImpl<>(
"<criteria>",
(SqmStatement) criteriaQuery,
criteriaQuery.getResultType(),
this
);
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Override
public QueryImplementor createQuery(CriteriaUpdate criteriaUpdate) {
checkOpen();
try {
return new QuerySqmImpl<>(
"<criteria>",
(SqmUpdateStatement) criteriaUpdate,
null,
this
);
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Override
public QueryImplementor createQuery(CriteriaDelete criteriaDelete) {
checkOpen();
try {
return new QuerySqmImpl<>(
"<criteria>",
(SqmDeleteStatement) criteriaDelete,
null,
this
);
}
catch ( RuntimeException e ) {
throw exceptionConverter.convert( e );
}
}
@Override
public StoredProcedureQuery createNamedStoredProcedureQuery(String name) {
checkOpen();
@ -3271,12 +3221,6 @@ public SessionFactoryImplementor getEntityManagerFactory() {
return getFactory();
}
@Override
public CriteriaBuilder getCriteriaBuilder() {
checkOpen();
return getFactory().getCriteriaBuilder();
}
@Override
public MetamodelImplementor getMetamodel() {
checkOpen();

View File

@ -8,6 +8,9 @@
import java.util.Date;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.StatelessSession;
@ -30,65 +33,79 @@ public String[] getMappings() {
@Test
public void testCreateUpdateReadDelete() {
StatelessSession ss = sessionFactory().openStatelessSession();
Transaction tx = ss.beginTransaction();
Document doc = new Document("blah blah blah", "Blahs");
ss.insert(doc);
assertNotNull( doc.getName() );
Date initVersion = doc.getLastModified();
assertNotNull( initVersion );
tx.commit();
try (StatelessSession ss = sessionFactory().openStatelessSession()) {
try {
Transaction tx = ss.beginTransaction();
Document doc = new Document( "blah blah blah", "Blahs" );
ss.insert( doc );
assertNotNull( doc.getName() );
Date initVersion = doc.getLastModified();
assertNotNull( initVersion );
tx.commit();
tx = ss.beginTransaction();
doc.setText("blah blah blah .... blah");
ss.update(doc);
assertNotNull( doc.getLastModified() );
assertNotSame( doc.getLastModified(), initVersion );
tx.commit();
tx = ss.beginTransaction();
doc.setText( "blah blah blah .... blah" );
ss.update( doc );
assertNotNull( doc.getLastModified() );
assertNotSame( doc.getLastModified(), initVersion );
tx.commit();
tx = ss.beginTransaction();
doc.setText("blah blah blah .... blah blay");
ss.update(doc);
tx.commit();
tx = ss.beginTransaction();
doc.setText( "blah blah blah .... blah blay" );
ss.update( doc );
tx.commit();
Document doc2 = (Document) ss.get(Document.class.getName(), "Blahs");
assertEquals("Blahs", doc2.getName());
assertEquals(doc.getText(), doc2.getText());
Document doc2 = (Document) ss.get( Document.class.getName(), "Blahs" );
assertEquals( "Blahs", doc2.getName() );
assertEquals( doc.getText(), doc2.getText() );
doc2 = (Document) ss.createQuery("from Document where text is not null").uniqueResult();
assertEquals("Blahs", doc2.getName());
assertEquals(doc.getText(), doc2.getText());
doc2 = (Document) ss.createQuery( "from Document where text is not null" ).uniqueResult();
assertEquals( "Blahs", doc2.getName() );
assertEquals( doc.getText(), doc2.getText() );
ScrollableResults sr = ss.createQuery("from Document where text is not null")
.scroll(ScrollMode.FORWARD_ONLY);
sr.next();
doc2 = (Document) sr.get();
sr.close();
assertEquals("Blahs", doc2.getName());
assertEquals(doc.getText(), doc2.getText());
ScrollableResults sr = ss.createQuery( "from Document where text is not null" )
.scroll( ScrollMode.FORWARD_ONLY );
sr.next();
doc2 = (Document) sr.get();
sr.close();
assertEquals( "Blahs", doc2.getName() );
assertEquals( doc.getText(), doc2.getText() );
doc2 = (Document) ss.createNativeQuery( "select * from Document")
.addEntity(Document.class)
.uniqueResult();
assertEquals("Blahs", doc2.getName());
assertEquals(doc.getText(), doc2.getText());
doc2 = (Document) ss.createNativeQuery( "select * from Document" )
.addEntity( Document.class )
.uniqueResult();
assertEquals( "Blahs", doc2.getName() );
assertEquals( doc.getText(), doc2.getText() );
doc2 = (Document) ss.createCriteria(Document.class).uniqueResult();
assertEquals("Blahs", doc2.getName());
assertEquals(doc.getText(), doc2.getText());
CriteriaBuilder criteriaBuilder = ss.getCriteriaBuilder();
CriteriaQuery<Document> criteria = criteriaBuilder.createQuery( Document.class );
criteria.from( Document.class );
doc2 = ss.createQuery( criteria ).uniqueResult();
assertEquals( "Blahs", doc2.getName() );
assertEquals( doc.getText(), doc2.getText() );
sr = ss.createCriteria(Document.class).scroll(ScrollMode.FORWARD_ONLY);
sr.next();
doc2 = (Document) sr.get();
sr.close();
assertEquals("Blahs", doc2.getName());
assertEquals(doc.getText(), doc2.getText());
criteria = criteriaBuilder.createQuery( Document.class );
criteria.from( Document.class );
tx = ss.beginTransaction();
ss.delete(doc);
tx.commit();
ss.close();
sr = ss.createQuery( criteria ).scroll( ScrollMode.FORWARD_ONLY );
sr.next();
doc2 = (Document) sr.get();
sr.close();
assertEquals( "Blahs", doc2.getName() );
assertEquals( doc.getText(), doc2.getText() );
tx = ss.beginTransaction();
ss.delete( doc );
tx.commit();
}
catch (Exception e) {
if ( ss.getTransaction().isActive() ) {
ss.getTransaction().rollback();
}
throw e;
}
}
}
@Test