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 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.procedure.ProcedureCall;
import org.hibernate.query.QueryProducer; import org.hibernate.query.QueryProducer;
@ -139,4 +144,23 @@ public interface SharedSessionContract extends QueryProducer, Serializable {
* @see org.hibernate.boot.SessionFactoryBuilder#applyJdbcBatchSize * @see org.hibernate.boot.SessionFactoryBuilder#applyJdbcBatchSize
*/ */
void setJdbcBatchSize(Integer jdbcBatchSize); 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 java.util.UUID;
import javax.persistence.FlushModeType; import javax.persistence.FlushModeType;
import javax.persistence.TransactionRequiredException; import javax.persistence.TransactionRequiredException;
import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaDelete; import javax.persistence.criteria.CriteriaDelete;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.CriteriaUpdate; import javax.persistence.criteria.CriteriaUpdate;
import javax.persistence.criteria.Selection;
import org.hibernate.CacheMode; import org.hibernate.CacheMode;
import org.hibernate.EmptyInterceptor; import org.hibernate.EmptyInterceptor;
@ -56,7 +55,6 @@
import org.hibernate.engine.transaction.internal.TransactionImpl; import org.hibernate.engine.transaction.internal.TransactionImpl;
import org.hibernate.engine.transaction.spi.TransactionImplementor; import org.hibernate.engine.transaction.spi.TransactionImplementor;
import org.hibernate.id.uuid.StandardRandomStrategy; import org.hibernate.id.uuid.StandardRandomStrategy;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.jpa.internal.util.FlushModeTypeHelper; import org.hibernate.jpa.internal.util.FlushModeTypeHelper;
import org.hibernate.jpa.spi.NativeQueryTupleTransformer; import org.hibernate.jpa.spi.NativeQueryTupleTransformer;
import org.hibernate.jpa.spi.TupleBuilderTransformer; import org.hibernate.jpa.spi.TupleBuilderTransformer;
@ -73,9 +71,10 @@
import org.hibernate.query.sql.internal.NativeQueryImpl; import org.hibernate.query.sql.internal.NativeQueryImpl;
import org.hibernate.query.sql.spi.NamedNativeQueryMemento; import org.hibernate.query.sql.spi.NamedNativeQueryMemento;
import org.hibernate.query.sql.spi.NativeQueryImplementor; 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.internal.QuerySqmImpl;
import org.hibernate.query.sqm.tree.SqmStatement; 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.JdbcSessionContext;
import org.hibernate.resource.jdbc.spi.StatementInspector; import org.hibernate.resource.jdbc.spi.StatementInspector;
import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl; import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl;
@ -862,6 +861,62 @@ public void setJdbcBatchSize(Integer jdbcBatchSize) {
this.jdbcBatchSize = 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") @SuppressWarnings("unused")
private void writeObject(ObjectOutputStream oos) throws IOException { private void writeObject(ObjectOutputStream oos) throws IOException {
if ( log.isTraceEnabled() ) { if ( log.isTraceEnabled() ) {

View File

@ -3104,56 +3104,6 @@ public Map<String, Object> getProperties() {
return Collections.unmodifiableMap( properties ); 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 @Override
public StoredProcedureQuery createNamedStoredProcedureQuery(String name) { public StoredProcedureQuery createNamedStoredProcedureQuery(String name) {
checkOpen(); checkOpen();
@ -3271,12 +3221,6 @@ public SessionFactoryImplementor getEntityManagerFactory() {
return getFactory(); return getFactory();
} }
@Override
public CriteriaBuilder getCriteriaBuilder() {
checkOpen();
return getFactory().getCriteriaBuilder();
}
@Override @Override
public MetamodelImplementor getMetamodel() { public MetamodelImplementor getMetamodel() {
checkOpen(); checkOpen();

View File

@ -8,6 +8,9 @@
import java.util.Date; import java.util.Date;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import org.hibernate.ScrollMode; import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults; import org.hibernate.ScrollableResults;
import org.hibernate.StatelessSession; import org.hibernate.StatelessSession;
@ -30,7 +33,8 @@ public String[] getMappings() {
@Test @Test
public void testCreateUpdateReadDelete() { public void testCreateUpdateReadDelete() {
StatelessSession ss = sessionFactory().openStatelessSession(); try (StatelessSession ss = sessionFactory().openStatelessSession()) {
try {
Transaction tx = ss.beginTransaction(); Transaction tx = ss.beginTransaction();
Document doc = new Document( "blah blah blah", "Blahs" ); Document doc = new Document( "blah blah blah", "Blahs" );
ss.insert( doc ); ss.insert( doc );
@ -74,11 +78,17 @@ public void testCreateUpdateReadDelete() {
assertEquals( doc.getText(), doc2.getText() ); assertEquals( doc.getText(), doc2.getText() );
doc2 = (Document) ss.createCriteria(Document.class).uniqueResult(); 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( "Blahs", doc2.getName() );
assertEquals( doc.getText(), doc2.getText() ); assertEquals( doc.getText(), doc2.getText() );
sr = ss.createCriteria(Document.class).scroll(ScrollMode.FORWARD_ONLY); criteria = criteriaBuilder.createQuery( Document.class );
criteria.from( Document.class );
sr = ss.createQuery( criteria ).scroll( ScrollMode.FORWARD_ONLY );
sr.next(); sr.next();
doc2 = (Document) sr.get(); doc2 = (Document) sr.get();
sr.close(); sr.close();
@ -88,7 +98,14 @@ public void testCreateUpdateReadDelete() {
tx = ss.beginTransaction(); tx = ss.beginTransaction();
ss.delete( doc ); ss.delete( doc );
tx.commit(); tx.commit();
ss.close(); }
catch (Exception e) {
if ( ss.getTransaction().isActive() ) {
ss.getTransaction().rollback();
}
throw e;
}
}
} }
@Test @Test