EJB-461 - Implement JPA 2.0 criteria apis (compiling)

git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@17426 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
Steve Ebersole 2009-08-26 20:34:58 +00:00
parent 4b6a3903a9
commit c5da7c30c1
8 changed files with 964 additions and 343 deletions

View File

@ -116,6 +116,10 @@ public abstract class AbstractQueryImpl implements Query {
this.parameterMetadata = parameterMetadata;
}
public ParameterMetadata getParameterMetadata() {
return parameterMetadata;
}
public String toString() {
return StringHelper.unqualify( getClass().getName() ) + '(' + queryString + ')';
}
@ -161,7 +165,13 @@ public abstract class AbstractQueryImpl implements Query {
}
public Query setMaxResults(int maxResults) {
selection.setMaxRows( new Integer(maxResults) );
if ( maxResults < 0 ) {
// treat negatives specically as meaning no limit...
selection.setMaxRows( null );
}
else {
selection.setMaxRows( new Integer(maxResults) );
}
return this;
}

View File

@ -1,8 +1,10 @@
/*
* Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Middleware LLC.
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @author tags or express
* copyright attribution statements applied by the authors. All
* third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@ -80,6 +82,7 @@ import org.hibernate.util.JTAHelper;
/**
* @author <a href="mailto:gavin@hibernate.org">Gavin King</a>
* @author Emmanuel Bernard
* @author Steve Ebersole
*/
@SuppressWarnings("unchecked")
public abstract class AbstractEntityManagerImpl implements HibernateEntityManagerImplementor, Serializable {
@ -115,19 +118,34 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
this.properties = null;
}
public Query createQuery(String ejbqlString) {
//adjustFlushMode();
public Query createQuery(String jpaqlString) {
try {
return new QueryImpl( getSession().createQuery( ejbqlString ), this );
return new QueryImpl<Object>( getSession().createQuery( jpaqlString ), this );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
return null;
throw convert( he );
}
}
public <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass) {
throw new UnsupportedOperationException( "Not yet implemented" );
public <T> TypedQuery<T> createQuery(String jpaqlString, Class<T> resultClass) {
try {
org.hibernate.Query hqlQuery = getSession().createQuery( jpaqlString );
if ( hqlQuery.getReturnTypes().length != 1 ) {
throw new IllegalArgumentException( "Cannot create TypedQuery for query with more than one return" );
}
if ( ! resultClass.isAssignableFrom( hqlQuery.getReturnTypes()[0].getReturnedClass() ) ) {
throw new IllegalArgumentException(
"Type specified for TypedQuery [" +
resultClass.getName() +
"] is incompatible with query return type [" +
hqlQuery.getReturnTypes()[0].getReturnedClass() + "]"
);
}
return new QueryImpl<T>( hqlQuery, this );
}
catch ( HibernateException he ) {
throw convert( he );
}
}
public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery) {
@ -165,69 +183,81 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
}
public Query createNamedQuery(String name) {
//adjustFlushMode();
org.hibernate.Query namedQuery;
try {
namedQuery = getSession().getNamedQuery( name );
org.hibernate.Query namedQuery = getSession().getNamedQuery( name );
try {
return new QueryImpl( namedQuery, this );
}
catch ( HibernateException he ) {
throw convert( he );
}
}
catch ( MappingException e ) {
throw new IllegalArgumentException( "Named query not found: " + name );
}
try {
return new QueryImpl( namedQuery, this );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
return null;
}
}
public <T> TypedQuery<T> createNamedQuery(String name, Class<T> resultClass) {
throw new UnsupportedOperationException( "Not yet implemented" );
try {
org.hibernate.Query namedQuery = getSession().getNamedQuery( name );
try {
if ( namedQuery.getReturnTypes().length != 1 ) {
throw new IllegalArgumentException( "Cannot create TypedQuery for query with more than one return" );
}
if ( ! resultClass.isAssignableFrom( namedQuery.getReturnTypes()[0].getReturnedClass() ) ) {
throw new IllegalArgumentException(
"Type specified for TypedQuery [" +
resultClass.getName() +
"] is incompatible with query return type [" +
namedQuery.getReturnTypes()[0].getReturnedClass() + "]"
);
}
return new QueryImpl<T>( namedQuery, this );
}
catch ( HibernateException he ) {
throw convert( he );
}
}
catch ( MappingException e ) {
throw new IllegalArgumentException( "Named query not found: " + name );
}
}
public Query createNativeQuery(String sqlString) {
//adjustFlushMode();
try {
SQLQuery q = getSession().createSQLQuery( sqlString );
return new QueryImpl( q, this );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
return null;
throw convert( he );
}
}
public Query createNativeQuery(String sqlString, Class resultClass) {
//adjustFlushMode();
try {
SQLQuery q = getSession().createSQLQuery( sqlString );
q.addEntity( "alias1", resultClass.getName(), LockMode.READ );
return new QueryImpl( q, this );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
return null;
throw convert( he );
}
}
public Query createNativeQuery(String sqlString, String resultSetMapping) {
//adjustFlushMode();
try {
SQLQuery q = getSession().createSQLQuery( sqlString );
q.setResultSetMapping( resultSetMapping );
return new QueryImpl( q, this );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
return null;
throw convert( he );
}
}
@SuppressWarnings("unchecked")
public <T> T getReference(Class<T> entityClass, Object primaryKey) {
//adjustFlushMode();
try {
return ( T ) getSession().load( entityClass, ( Serializable ) primaryKey );
}
@ -241,14 +271,12 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
throw new IllegalArgumentException( e.getMessage(), e );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
return null;
throw convert( he );
}
}
@SuppressWarnings("unchecked")
public <A> A find(Class<A> entityClass, Object primaryKey) {
//adjustFlushMode();
try {
return ( A ) getSession().get( entityClass, ( Serializable ) primaryKey );
}
@ -270,8 +298,7 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
throw new IllegalArgumentException( e.getMessage(), e );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
return null;
throw convert( he );
}
}
@ -301,7 +328,6 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
public void persist(Object entity) {
checkTransactionNeeded();
//adjustFlushMode();
try {
getSession().persist( entity );
}
@ -309,14 +335,13 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
throw new IllegalArgumentException( e.getMessage() );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
throw convert( he );
}
}
@SuppressWarnings("unchecked")
public <A> A merge(A entity) {
checkTransactionNeeded();
//adjustFlushMode();
try {
return ( A ) getSession().merge( entity );
}
@ -327,14 +352,12 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
throw new IllegalArgumentException( e.getMessage(), e );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
return null;
throw convert( he );
}
}
public void remove(Object entity) {
checkTransactionNeeded();
//adjustFlushMode();
try {
getSession().delete( entity );
}
@ -342,13 +365,12 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
throw new IllegalArgumentException( e.getMessage(), e );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
throw convert( he );
}
}
public void refresh(Object entity) {
checkTransactionNeeded();
//adjustFlushMode();
try {
if ( !getSession().contains( entity ) ) {
throw new IllegalArgumentException( "Entity not managed" );
@ -359,7 +381,7 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
throw new IllegalArgumentException( e.getMessage(), e );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
throw convert( he );
}
}
@ -391,8 +413,7 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
throw new IllegalArgumentException( e.getMessage(), e );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
return false;
throw convert( he );
}
}
@ -425,7 +446,7 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
getSession().flush();
}
catch ( HibernateException he ) {
throwPersistenceException( he );
throw convert( he );
}
}
@ -490,7 +511,7 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
getSession().clear();
}
catch ( HibernateException he ) {
throwPersistenceException( he );
throw convert( he );
}
}
@ -499,7 +520,7 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
getSession().evict( entity );
}
catch ( HibernateException he ) {
throwPersistenceException( he );
throw convert( he );
}
}
@ -672,14 +693,17 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
log.trace( "skipping managed flushing" );
}
}
catch ( HibernateException he ) {
throw convert( he );
}
catch( PersistenceException pe ) {
handlePersistenceException( pe );
throw pe;
}
catch ( RuntimeException re ) {
//throwPersistenceException will mark the transaction as rollbacked
if ( re instanceof HibernateException ) {
throwPersistenceException( ( HibernateException ) re );
}
else {
throwPersistenceException( new PersistenceException( re ) );
}
PersistenceException wrapped = new PersistenceException( re );
handlePersistenceException( wrapped );
throw wrapped;
}
}
@ -698,7 +722,7 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
}
}
catch ( HibernateException e ) {
throwPersistenceException( e );
throw convert( e );
}
}
}
@ -709,7 +733,7 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
}
}
catch ( HibernateException he ) {
throwPersistenceException( he );
throw convert( he );
}
}
else {
@ -735,35 +759,60 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
tx = new TransactionImpl( this );
}
public void throwPersistenceException(PersistenceException e) {
if ( !( e instanceof NoResultException || e instanceof NonUniqueResultException ) ) {
try {
markAsRollback();
}
catch ( Exception ne ) {
//we do not want the subsequent exception to swallow the original one
log.error( "Unable to mark for rollback on PersistenceException: ", ne );
}
/**
* {@inheritDoc}
*/
public void handlePersistenceException(PersistenceException e) {
if ( e instanceof NoResultException ) {
return;
}
if ( e instanceof NonUniqueResultException ) {
return;
}
try {
markAsRollback();
}
catch ( Exception ne ) {
//we do not want the subsequent exception to swallow the original one
log.error( "Unable to mark for rollback on PersistenceException: ", ne );
}
}
/**
* {@inheritDoc}
*/
public void throwPersistenceException(PersistenceException e) {
handlePersistenceException( e );
throw e;
}
public void throwPersistenceException(HibernateException e) {
/**
* {@inheritDoc}
*/
public RuntimeException convert(HibernateException e) {
if ( e instanceof StaleStateException ) {
PersistenceException pe = wrapStaleStateException( ( StaleStateException ) e );
throwPersistenceException( pe );
PersistenceException converted = wrapStaleStateException( ( StaleStateException ) e );
handlePersistenceException( converted );
return converted;
}
else if ( e instanceof ObjectNotFoundException ) {
throwPersistenceException( new EntityNotFoundException( e.getMessage() ) );
EntityNotFoundException converted = new EntityNotFoundException( e.getMessage() );
handlePersistenceException( converted );
return converted;
}
else if ( e instanceof org.hibernate.NonUniqueResultException ) {
throwPersistenceException( new NonUniqueResultException( e.getMessage() ) );
NonUniqueResultException converted = new NonUniqueResultException( e.getMessage() );
handlePersistenceException( converted );
return converted;
}
else if ( e instanceof UnresolvableObjectException ) {
throwPersistenceException( new EntityNotFoundException( e.getMessage() ) );
EntityNotFoundException converted = new EntityNotFoundException( e.getMessage() );
handlePersistenceException( converted );
return converted;
}
else if ( e instanceof QueryException ) {
throw new IllegalArgumentException( e );
return new IllegalArgumentException( e );
}
else if ( e instanceof TransientObjectException ) {
try {
@ -773,13 +822,25 @@ public abstract class AbstractEntityManagerImpl implements HibernateEntityManage
//we do not want the subsequent exception to swallow the original one
log.error( "Unable to mark for rollback on TransientObjectException: ", ne );
}
throw new IllegalStateException( e ); //Spec 3.2.3 Synchronization rules
return new IllegalStateException( e ); //Spec 3.2.3 Synchronization rules
}
else {
throwPersistenceException( new PersistenceException( e ) );
PersistenceException converted = new PersistenceException( e );
handlePersistenceException( converted );
return converted;
}
}
/**
* {@inheritDoc}
*/
public void throwPersistenceException(HibernateException e) {
throw convert( e );
}
/**
* {@inheritDoc}
*/
public PersistenceException wrapStaleStateException(StaleStateException e) {
PersistenceException pe;
if ( e instanceof StaleObjectStateException ) {

View File

@ -0,0 +1,352 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @author tags or express
* copyright attribution statements applied by the authors. All
* third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.ejb;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.persistence.FlushModeType;
import javax.persistence.Parameter;
import javax.persistence.TransactionRequiredException;
import javax.persistence.TypedQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.CacheMode;
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.TypeMismatchException;
import static org.hibernate.ejb.QueryHints.HINT_CACHEABLE;
import static org.hibernate.ejb.QueryHints.HINT_CACHE_MODE;
import static org.hibernate.ejb.QueryHints.HINT_CACHE_REGION;
import static org.hibernate.ejb.QueryHints.HINT_COMMENT;
import static org.hibernate.ejb.QueryHints.HINT_FETCH_SIZE;
import static org.hibernate.ejb.QueryHints.HINT_FLUSH_MODE;
import static org.hibernate.ejb.QueryHints.HINT_READONLY;
import static org.hibernate.ejb.QueryHints.HINT_TIMEOUT;
import org.hibernate.ejb.util.ConfigurationHelper;
import org.hibernate.hql.QueryExecutionRequestException;
/**
* Intended as a base class providing convenience in implementing both {@link javax.persistence.Query} and
* {@link javax.persistence.TypedQuery}.
* <p/>
* IMPL NOTE : This issue, and the reason for this distinction, is that criteria and hl.sql queries share no
* commonality currently in Hibernate internals.
*
* @author Steve Ebersole
*/
public abstract class AbstractQueryImpl<X> implements TypedQuery<X> {
private static final Logger log = LoggerFactory.getLogger( AbstractQueryImpl.class );
private final HibernateEntityManagerImplementor entityManager;
public AbstractQueryImpl(HibernateEntityManagerImplementor entityManager) {
this.entityManager = entityManager;
}
protected HibernateEntityManagerImplementor getEntityManager() {
return entityManager;
}
/**
* Actually execute the update; all pre-requisites have been checked.
*
* @return The number of "affected rows".
*/
protected abstract int internalExecuteUpdate();
/**
* {@inheritDoc}
*/
@SuppressWarnings({ "ThrowableInstanceNeverThrown" })
public int executeUpdate() {
try {
if ( ! entityManager.isTransactionInProgress() ) {
entityManager.throwPersistenceException( new TransactionRequiredException( "Executing an update/delete query" ) );
return 0;
}
return internalExecuteUpdate();
}
catch ( QueryExecutionRequestException he) {
throw new IllegalStateException(he);
}
catch( TypeMismatchException e ) {
throw new IllegalArgumentException(e);
}
catch ( HibernateException he) {
entityManager.throwPersistenceException( he );
return 0;
}
}
private int maxResults = -1;
/**
* Apply the given max results value.
*
* @param maxResults The specified max results
*/
protected abstract void applyMaxResults(int maxResults);
/**
* {@inheritDoc}
*/
public TypedQuery<X> setMaxResults(int maxResult) {
if ( maxResult < 0 ) {
throw new IllegalArgumentException(
"Negative value (" + maxResult + ") passed to setMaxResults"
);
}
this.maxResults = maxResult;
applyMaxResults( maxResult );
return this;
}
public int getSpecifiedMaxResults() {
return maxResults;
}
public int getMaxResults() {
return maxResults == -1
? Integer.MAX_VALUE // stupid spec... MAX_VALUE??
: maxResults;
}
private int firstResult;
/**
* Apply the given first-result value.
*
* @param firstResult The specified first-result value.
*/
protected abstract void applyFirstResult(int firstResult);
public TypedQuery<X> setFirstResult(int firstResult) {
if ( firstResult < 0 ) {
throw new IllegalArgumentException(
"Negative value (" + firstResult + ") passed to setFirstResult"
);
}
this.firstResult = firstResult;
applyFirstResult( firstResult );
return this;
}
public int getFirstResult() {
return firstResult;
}
private Map<String, Object> hints;
/**
* {@inheritDoc}
*/
public Map<String, Object> getHints() {
return hints;
}
protected abstract void applyTimeout(int timeout);
protected abstract void applyComment(String comment);
protected abstract void applyFetchSize(int fetchSize);
protected abstract void applyCacheable(boolean isCacheable);
protected abstract void applyCacheRegion(String regionName);
protected abstract void applyReadOnly(boolean isReadOnly);
protected abstract void applyCacheMode(CacheMode cacheMode);
protected abstract void applyFlushMode(FlushMode flushMode);
/**
* {@inheritDoc}
*/
public TypedQuery<X> setHint(String hintName, Object value) {
boolean skipped = false;
try {
if ( HINT_TIMEOUT.equals( hintName ) ) {
applyTimeout( ConfigurationHelper.getInteger( value ) );
}
else if ( HINT_COMMENT.equals( hintName ) ) {
applyComment( (String) value );
}
else if ( HINT_FETCH_SIZE.equals( hintName ) ) {
applyFetchSize( ConfigurationHelper.getInteger( value ) );
}
else if ( HINT_CACHEABLE.equals( hintName ) ) {
applyCacheable( ConfigurationHelper.getBoolean( value ) );
}
else if ( HINT_CACHE_REGION.equals( hintName ) ) {
applyCacheRegion( (String) value );
}
else if ( HINT_READONLY.equals( hintName ) ) {
applyReadOnly( ConfigurationHelper.getBoolean( value ) );
}
else if ( HINT_CACHE_MODE.equals( hintName ) ) {
applyCacheMode( ConfigurationHelper.getCacheMode( value ) );
}
else if ( HINT_FLUSH_MODE.equals( hintName ) ) {
applyFlushMode( ConfigurationHelper.getFlushMode( value ) );
}
/* TODO:
else if ( "org.hibernate.lockMode".equals( hintName ) ) {
query.setLockMode( alias, lockMode );
}*/
else {
skipped = true;
log.info( "Ignoring unrecognized query hint [" + hintName + "]" );
}
}
catch ( ClassCastException e ) {
throw new IllegalArgumentException( "Value for hint" );
}
if ( !skipped ) {
if ( hints == null ) {
hints = new HashMap<String,Object>();
}
hints.put( hintName, value );
}
return this;
}
public Set<String> getSupportedHints() {
return QueryHints.getDefinedHints();
}
private FlushModeType jpaFlushMode;
public TypedQuery<X> setFlushMode(FlushModeType jpaFlushMode) {
this.jpaFlushMode = jpaFlushMode;
// TODO : treat as hint?
if ( jpaFlushMode == FlushModeType.AUTO ) {
applyFlushMode( FlushMode.AUTO );
}
else if ( jpaFlushMode == FlushModeType.COMMIT ) {
applyFlushMode( FlushMode.COMMIT );
}
return this;
}
protected FlushModeType getSpecifiedFlushMode() {
return jpaFlushMode;
}
public FlushModeType getFlushMode() {
return jpaFlushMode != null
? jpaFlushMode
: entityManager.getFlushMode();
}
private Map parameterBindings;
protected void registerParameterBinding(Parameter parameter, Object value) {
if ( value != null && parameter.getJavaType() != null ) {
if ( Collection.class.isInstance( value ) ) {
final Collection collection = (Collection) value;
// validate the elements...
for ( Object element : collection ) {
if ( ! parameter.getJavaType().isInstance( element ) ) {
throw new IllegalArgumentException(
"Parameter value [" + element + "] was not matching type [" +
parameter.getJavaType().getName() + "]"
);
}
}
}
else if ( value.getClass().isArray() ) {
final Object[] array = (Object[]) value;
for ( Object element : array ) {
if ( ! parameter.getJavaType().isInstance( element ) ) {
throw new IllegalArgumentException(
"Parameter value [" + element + "] was not matching type [" +
parameter.getJavaType().getName() + "]"
);
}
}
}
else {
if ( ! parameter.getJavaType().isInstance( value ) ) {
throw new IllegalArgumentException(
"Parameter value [" + value + "] was not matching type [" +
parameter.getJavaType().getName() + "]"
);
}
}
}
if ( parameterBindings == null ) {
parameterBindings = new HashMap();
}
parameterBindings.put( parameter, value );
}
/**
* {@inheritDoc}
*/
public boolean isBound(Parameter<?> param) {
return parameterBindings != null && parameterBindings.containsKey( param );
}
/**
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public <T> T getParameterValue(Parameter<T> param) {
if ( parameterBindings == null ) {
throw new IllegalStateException( "No parameters have been bound" );
}
try {
T value = (T) parameterBindings.get( param );
if ( value == null ) {
throw new IllegalStateException( "Parameter has not been bound" );
}
return value;
}
catch ( ClassCastException cce ) {
throw new IllegalStateException( "Encountered a parameter value type exception" );
}
}
/**
* {@inheritDoc}
*/
public Object getParameterValue(String name) {
return getParameterValue( getParameter( name ) );
}
/**
* {@inheritDoc}
*/
public Object getParameterValue(int position) {
return getParameterValue( getParameter( position ) );
}
}

View File

@ -1,8 +1,10 @@
/*
* Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Middleware LLC.
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @author tags or express
* copyright attribution statements applied by the authors. All
* third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@ -19,8 +21,6 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
//$Id$
package org.hibernate.ejb;
import javax.persistence.PersistenceException;
@ -29,13 +29,50 @@ import org.hibernate.HibernateException;
import org.hibernate.StaleStateException;
/**
* Additional internal contracts for the Hibernate {@link javax.persistence.EntityManager} implementation.
*
* @author Emmanuel Bernard
* @author Steve Ebersole
*/
public interface HibernateEntityManagerImplementor extends HibernateEntityManager {
/**
* Provides access to whether a transaction is currently in progress.
*
* @return True if a transaction is considered currently in progress; false otherwise.
*/
boolean isTransactionInProgress();
/**
* Handles marking for rollback and other such operations that need to occur depending on the type of
* exception being handled.
*
* @param e The exception being handled.
*/
public void handlePersistenceException(PersistenceException e);
/**
* Delegates to {@link #handlePersistenceException} and then throws the given exception.
*
* @param e The exception being handled and finally thrown.
*/
public void throwPersistenceException(PersistenceException e);
/**
* Converts a Hibernate-specific exception into a JPA-specified exception; note that the JPA sepcification makes use
* of exceptions outside its exception hierarchy, though they are all runtime exceptions.
* <p/>
* Any appropriate/needed calls to {@link #handlePersistenceException} are also made.
*
* @param e The Hibernate excepton.
* @return The JPA-specified exception
*/
public RuntimeException convert(HibernateException e);
/**
* Delegates to {@link #convert} and then throws the given exception.
*
* @param e The exception being handled and finally thrown.
*/
public void throwPersistenceException(HibernateException e);
public PersistenceException wrapStaleStateException(StaleStateException e);

View File

@ -1,8 +1,10 @@
/*
* Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Middleware LLC.
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @author tags or express
* copyright attribution statements applied by the authors. All
* third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@ -17,31 +19,16 @@
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
* Boston, MA 02110-1301 USA\
*/
//$Id$
package org.hibernate.ejb;
import java.util.Map;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Modifier;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceException;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.LoadState;
import javax.persistence.spi.PersistenceUnitInfo;
import org.hibernate.Hibernate;
import org.hibernate.ejb.util.PersistenceUtilHelper;
import org.hibernate.intercept.FieldInterceptionHelper;
import org.hibernate.intercept.FieldInterceptor;
import org.hibernate.collection.PersistentCollection;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.proxy.LazyInitializer;
/**
* Hibernate EJB3 persistence provider implementation

View File

@ -1,8 +1,10 @@
/*
* Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Middleware LLC.
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @author tags or express
* copyright attribution statements applied by the authors. All
* third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@ -17,10 +19,8 @@
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
* Boston, MA 02110-1301 USA\
*/
//$Id$
package org.hibernate.ejb;
import javax.persistence.Query;

View File

@ -0,0 +1,62 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @author tags or express
* copyright attribution statements applied by the authors. All
* third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA\
*/
package org.hibernate.ejb;
import java.util.Set;
import java.util.HashSet;
/**
* TODO : javadoc
*
* @author Steve Ebersole
*/
public class QueryHints {
public static final String HINT_TIMEOUT = "org.hibernate.timeout";
public static final String HINT_COMMENT = "org.hibernate.comment";
public static final String HINT_FETCH_SIZE = "org.hibernate.fetchSize";
public static final String HINT_CACHE_REGION = "org.hibernate.cacheRegion";
public static final String HINT_CACHEABLE = "org.hibernate.cacheable";
public static final String HINT_READONLY = "org.hibernate.readOnly";
public static final String HINT_CACHE_MODE = "org.hibernate.cacheMode";
public static final String HINT_FLUSH_MODE = "org.hibernate.flushMode";
private static final Set<String> HINTS = buildHintsSet();
private static Set<String> buildHintsSet() {
HashSet<String> hints = new HashSet<String>();
hints.add( HINT_TIMEOUT );
hints.add( HINT_COMMENT );
hints.add( HINT_FETCH_SIZE );
hints.add( HINT_CACHE_REGION );
hints.add( HINT_CACHEABLE );
hints.add( HINT_READONLY );
hints.add( HINT_CACHE_MODE );
hints.add( HINT_FLUSH_MODE );
return java.util.Collections.unmodifiableSet( hints );
}
public static Set<String> getDefinedHints() {
return HINTS;
}
}

View File

@ -1,8 +1,10 @@
/*
* Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Middleware LLC.
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
* third-party contributors as indicated by either @author tags or express
* copyright attribution statements applied by the authors. All
* third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@ -26,55 +28,187 @@ package org.hibernate.ejb;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Map;
import javax.persistence.FlushModeType;
import javax.persistence.LockModeType;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.TemporalType;
import static javax.persistence.TemporalType.*;
import javax.persistence.TransactionRequiredException;
import javax.persistence.LockModeType;
import javax.persistence.Parameter;
import static javax.persistence.TemporalType.DATE;
import static javax.persistence.TemporalType.TIME;
import static javax.persistence.TemporalType.TIMESTAMP;
import javax.persistence.TypedQuery;
import javax.persistence.PersistenceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.CacheMode;
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.QueryParameterException;
import org.hibernate.TypeMismatchException;
import org.hibernate.impl.AbstractQueryImpl;
import org.hibernate.ejb.util.ConfigurationHelper;
import org.hibernate.engine.query.NamedParameterDescriptor;
import org.hibernate.engine.query.OrdinalParameterDescriptor;
import org.hibernate.hql.QueryExecutionRequestException;
import org.hibernate.impl.AbstractQueryImpl;
/**
* Hibernate implementation of both the {@link Query} and {@link TypedQuery} contracts.
*
* @author <a href="mailto:gavin@hibernate.org">Gavin King</a>
* @author Emmanuel Bernard
* @author Steve Ebersole
*/
public class QueryImpl implements Query, HibernateQuery {
public class QueryImpl<X> extends org.hibernate.ejb.AbstractQueryImpl<X> implements TypedQuery<X>, HibernateQuery {
private static final Logger log = LoggerFactory.getLogger( QueryImpl.class );
private org.hibernate.Query query;
private HibernateEntityManagerImplementor em;
private Boolean isPositional = null;
private int maxResults = -1;
private int firstResult;
private Set<Integer> jpaPositionalIndices;
private Set<Parameter<?>> parameters;
public QueryImpl(org.hibernate.Query query, AbstractEntityManagerImpl em) {
super( em );
this.query = query;
this.em = em;
extractParameterInfo();
}
@SuppressWarnings({ "unchecked" })
private void extractParameterInfo() {
if ( ! AbstractQueryImpl.class.isInstance( query ) ) {
throw new IllegalStateException( "Unknown query type for parameter extraction" );
}
HashSet<Parameter<?>> parameters = new HashSet<Parameter<?>>();
AbstractQueryImpl queryImpl = AbstractQueryImpl.class.cast( query );
// extract named params
for ( String name : (Set<String>) queryImpl.getParameterMetadata().getNamedParameterNames() ) {
final NamedParameterDescriptor descriptor =
queryImpl.getParameterMetadata().getNamedParameterDescriptor( name );
final ParameterImpl parameter = new ParameterImpl(
name,
descriptor.getExpectedType() == null
? null
: descriptor.getExpectedType().getReturnedClass()
);
parameters.add( parameter );
if ( descriptor.isJpaStyle() ) {
if ( jpaPositionalIndices == null ) {
jpaPositionalIndices = new HashSet<Integer>();
}
jpaPositionalIndices.add( Integer.valueOf( name ) );
}
}
// extract positional parameters
for ( int i = 0, max = queryImpl.getParameterMetadata().getOrdinalParameterCount(); i < max; i++ ) {
final OrdinalParameterDescriptor descriptor =
queryImpl.getParameterMetadata().getOrdinalParameterDescriptor( i+1 );
ParameterImpl parameter = new ParameterImpl(
descriptor.getOrdinalPosition() + 1,
descriptor.getExpectedType() == null
? null
: descriptor.getExpectedType().getReturnedClass()
);
parameters.add( parameter );
Integer position = descriptor.getOrdinalPosition();
if ( jpaPositionalIndices != null && jpaPositionalIndices.contains( position ) ) {
log.warn( "Parameter position [" + position + "] occurred as both JPA and Hibernate positional parameter" );
}
}
this.parameters = java.util.Collections.unmodifiableSet( parameters );
}
private static class ParameterImpl implements Parameter {
private final String name;
private final Integer position;
private final Class javaType;
private ParameterImpl(String name, Class javaType) {
this.name = name;
this.javaType = javaType;
this.position = null;
}
private ParameterImpl(Integer position, Class javaType) {
this.position = position;
this.javaType = javaType;
this.name = null;
}
public String getName() {
return name;
}
public Integer getPosition() {
return position;
}
public Class getJavaType() {
return javaType;
}
}
public org.hibernate.Query getHibernateQuery() {
return query;
}
public int executeUpdate() {
protected int internalExecuteUpdate() {
return query.executeUpdate();
}
protected void applyMaxResults(int maxResults) {
query.setMaxResults( maxResults );
}
protected void applyFirstResult(int firstResult) {
query.setFirstResult( firstResult );
}
protected void applyTimeout(int timeout) {
query.setTimeout( timeout );
}
protected void applyComment(String comment) {
query.setComment( comment );
}
protected void applyFetchSize(int fetchSize) {
query.setFetchSize( fetchSize );
}
protected void applyCacheable(boolean isCacheable) {
query.setCacheable( isCacheable );
}
protected void applyCacheRegion(String regionName) {
query.setCacheRegion( regionName );
}
protected void applyReadOnly(boolean isReadOnly) {
query.setReadOnly( isReadOnly );
}
protected void applyCacheMode(CacheMode cacheMode) {
query.setCacheMode( cacheMode );
}
protected void applyFlushMode(FlushMode flushMode) {
query.setFlushMode( flushMode );
}
/**
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public List<X> getResultList() {
try {
if ( ! em.isTransactionInProgress() ) {
em.throwPersistenceException( new TransactionRequiredException( "Executing an update/delete query" ) );
return 0;
}
return query.executeUpdate();
return (List<X>) query.list();
}
catch (QueryExecutionRequestException he) {
throw new IllegalStateException(he);
@ -83,56 +217,39 @@ public class QueryImpl implements Query, HibernateQuery {
throw new IllegalArgumentException(e);
}
catch (HibernateException he) {
em.throwPersistenceException( he );
return 0;
throw getEntityManager().convert( he );
}
}
public List getResultList() {
/**
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public X getSingleResult() {
try {
return query.list();
}
catch (QueryExecutionRequestException he) {
throw new IllegalStateException(he);
}
catch( TypeMismatchException e ) {
throw new IllegalArgumentException(e);
}
catch (HibernateException he) {
em.throwPersistenceException( he );
return null;
}
}
public Object getSingleResult() {
try {
List result;
/* Avoid OOME if the list() is huge (user faulty query) by limiting the query to 2 elements max */
//FIXME: get rid of this impl binding (HHH-3432)
if ( query instanceof AbstractQueryImpl ) {
if (maxResults != 1) query.setMaxResults( 2 ); //avoid OOME if the list is huge
result = query.list();
if ( maxResults != -1 ) {
query.setMaxResults( maxResults ); //put back the original value
}
else {
AbstractQueryImpl queryImpl = AbstractQueryImpl.class.cast( query );
queryImpl.getSelection().setMaxRows( null );
}
boolean mucked = false;
// IMPL NOTE : the mucking with max results here is attempting to help the user from shooting themselves
// in the foot in the case where they have a large query by limiting the query results to 2 max
if ( getSpecifiedMaxResults() != 1 ) {
mucked = true;
query.setMaxResults( 2 ); //avoid OOME if the list is huge
}
else {
//we can't do much because we cannot reset the maxResults => do the full list call
//Not tremendously bad as the user is doing a fault here anyway by calling getSingleREsults on a big list
result = query.list();
List<X> result = (List<X>) query.list();
if ( mucked ) {
query.setMaxResults( getSpecifiedMaxResults() );
}
if ( result.size() == 0 ) {
em.throwPersistenceException( new NoResultException( "No entity found for query" ) );
NoResultException nre = new NoResultException( "No entity found for query" );
getEntityManager().handlePersistenceException( nre );
throw nre;
}
else if ( result.size() > 1 ) {
Set uniqueResult = new HashSet(result);
Set<X> uniqueResult = new HashSet<X>(result);
if ( uniqueResult.size() > 1 ) {
em.throwPersistenceException( new NonUniqueResultException( "result returns more than one elements") );
NonUniqueResultException nure = new NonUniqueResultException( "result returns more than one elements" );
getEntityManager().handlePersistenceException( nure );
throw nure;
}
else {
return uniqueResult.iterator().next();
@ -140,9 +257,8 @@ public class QueryImpl implements Query, HibernateQuery {
}
else {
return result.get(0);
return result.get( 0 );
}
return null; //should never happen
}
catch (QueryExecutionRequestException he) {
throw new IllegalStateException(he);
@ -151,93 +267,56 @@ public class QueryImpl implements Query, HibernateQuery {
throw new IllegalArgumentException(e);
}
catch (HibernateException he) {
em.throwPersistenceException( he );
return null;
throw getEntityManager().convert( he );
}
}
public Query setMaxResults(int maxResult) {
if ( maxResult < 0 ) {
throw new IllegalArgumentException(
"Negative ("
+ maxResult
+ ") parameter passed in to setMaxResults"
);
public <T> TypedQuery<X> setParameter(Parameter<T> param, T value) {
if ( ! parameters.contains( param ) ) {
throw new IllegalArgumentException( "Specified parameter was not found in query" );
}
this.maxResults = maxResult;
query.setMaxResults( maxResult );
return this;
}
public int getMaxResults() {
return maxResults == -1 ? Integer.MAX_VALUE : maxResults; //stupid spec MAX_VALUE??
}
public Query setFirstResult(int firstResult) {
if ( firstResult < 0 ) {
throw new IllegalArgumentException(
"Negative ("
+ firstResult
+ ") parameter passed in to setFirstResult"
);
if ( param.getName() != null ) {
// a named param, for not delegate out. Eventually delegate *into* this method...
setParameter( param.getName(), value );
}
query.setFirstResult( firstResult );
this.firstResult = firstResult;
return this;
}
public int getFirstResult() {
return firstResult;
}
public Query setHint(String hintName, Object value) {
try {
if ( "org.hibernate.timeout".equals( hintName ) ) {
query.setTimeout( ConfigurationHelper.getInteger( value ) );
}
else if ( "org.hibernate.comment".equals( hintName ) ) {
query.setComment( (String) value );
}
else if ( "org.hibernate.fetchSize".equals( hintName ) ) {
query.setFetchSize( ConfigurationHelper.getInteger( value ) );
}
else if ( "org.hibernate.cacheRegion".equals( hintName ) ) {
query.setCacheRegion( (String) value );
}
else if ( "org.hibernate.cacheable".equals( hintName ) ) {
query.setCacheable( ConfigurationHelper.getBoolean( value ) );
}
else if ( "org.hibernate.readOnly".equals( hintName ) ) {
query.setReadOnly( ConfigurationHelper.getBoolean( value ) );
}
else if ( "org.hibernate.cacheMode".equals( hintName ) ) {
query.setCacheMode( ConfigurationHelper.getCacheMode( value ) );
}
else if ( "org.hibernate.flushMode".equals( hintName ) ) {
query.setFlushMode( ConfigurationHelper.getFlushMode( value ) );
}
//TODO:
/*else if ( "org.hibernate.lockMode".equals( hintName ) ) {
query.setLockMode( alias, lockMode );
}*/
}
catch (ClassCastException e) {
throw new IllegalArgumentException( "Value for hint" );
else {
setParameter( param.getPosition(), value );
}
return this;
}
public Map<String, Object> getHints() {
//FIXME
return null; //To change body of implemented methods use File | Settings | File Templates.
public TypedQuery<X> setParameter(Parameter<Date> param, Date value, TemporalType temporalType) {
if ( ! parameters.contains( param ) ) {
throw new IllegalArgumentException( "Specified parameter was not found in query" );
}
if ( param.getName() != null ) {
// a named param, for not delegate out. Eventually delegate *into* this method...
setParameter( param.getName(), value, temporalType );
}
else {
setParameter( param.getPosition(), value, temporalType );
}
return this;
}
public Set<String> getSupportedHints() {
//FIXME
return null; //To change body of implemented methods use File | Settings | File Templates.
public TypedQuery<X> setParameter(Parameter<Calendar> param, Calendar value, TemporalType temporalType) {
if ( ! parameters.contains( param ) ) {
throw new IllegalArgumentException( "Specified parameter was not found in query" );
}
if ( param.getName() != null ) {
// a named param, for not delegate out. Eventually delegate *into* this method...
setParameter( param.getName(), value, temporalType );
}
else {
setParameter( param.getPosition(), value, temporalType );
}
return this;
}
public Query setParameter(String name, Object value) {
/**
* {@inheritDoc}
*/
public TypedQuery<X> setParameter(String name, Object value) {
try {
if ( value instanceof Collection ) {
query.setParameterList( name, (Collection) value );
@ -245,18 +324,21 @@ public class QueryImpl implements Query, HibernateQuery {
else {
query.setParameter( name, value );
}
registerParameterBinding( getParameter( name ), value );
return this;
}
catch (QueryParameterException e) {
throw new IllegalArgumentException( e );
}
catch (HibernateException he) {
em.throwPersistenceException( he );
return null;
throw getEntityManager().convert( he );
}
}
public Query setParameter(String name, Date value, TemporalType temporalType) {
/**
* {@inheritDoc}
*/
public TypedQuery<X> setParameter(String name, Date value, TemporalType temporalType) {
try {
if ( temporalType == DATE ) {
query.setDate( name, value );
@ -267,18 +349,21 @@ public class QueryImpl implements Query, HibernateQuery {
else if ( temporalType == TIMESTAMP ) {
query.setTimestamp( name, value );
}
registerParameterBinding( getParameter( name ), value );
return this;
}
catch (QueryParameterException e) {
throw new IllegalArgumentException( e );
}
catch (HibernateException he) {
em.throwPersistenceException( he );
return null;
throw getEntityManager().convert( he );
}
}
public Query setParameter(String name, Calendar value, TemporalType temporalType) {
/**
* {@inheritDoc}
*/
public TypedQuery<X> setParameter(String name, Calendar value, TemporalType temporalType) {
try {
if ( temporalType == DATE ) {
query.setCalendarDate( name, value );
@ -289,24 +374,28 @@ public class QueryImpl implements Query, HibernateQuery {
else if ( temporalType == TIMESTAMP ) {
query.setCalendar( name, value );
}
registerParameterBinding( getParameter(name), value );
return this;
}
catch (QueryParameterException e) {
throw new IllegalArgumentException( e );
}
catch (HibernateException he) {
em.throwPersistenceException( he );
return null;
throw getEntityManager().convert( he );
}
}
public Query setParameter(int position, Object value) {
/**
* {@inheritDoc}
*/
public TypedQuery<X> setParameter(int position, Object value) {
try {
if ( isPositionalParameter() ) {
if ( isJpaPositionalParameter( position ) ) {
this.setParameter( Integer.toString( position ), value );
}
else {
query.setParameter( position - 1, value );
registerParameterBinding( getParameter( position ), value );
}
return this;
}
@ -314,35 +403,20 @@ public class QueryImpl implements Query, HibernateQuery {
throw new IllegalArgumentException( e );
}
catch (HibernateException he) {
em.throwPersistenceException( he );
return null;
throw getEntityManager().convert( he );
}
}
private boolean isPositionalParameter() {
if (isPositional == null) {
//compute it
String queryString = query.getQueryString();
int index = queryString.indexOf( '?' );
//there is a ? and the following char is a digit
if (index == -1) {
//no ?
isPositional = true;
}
else if ( index == queryString.length() - 1 ) {
// "... ?"
isPositional = false;
}
else {
isPositional = Character.isDigit( queryString.charAt( index + 1 ) );
}
}
return isPositional;
private boolean isJpaPositionalParameter(int position) {
return jpaPositionalIndices != null && jpaPositionalIndices.contains( position );
}
public Query setParameter(int position, Date value, TemporalType temporalType) {
/**
* {@inheritDoc}
*/
public TypedQuery<X> setParameter(int position, Date value, TemporalType temporalType) {
try {
if ( isPositionalParameter() ) {
if ( isJpaPositionalParameter( position ) ) {
String name = Integer.toString( position );
this.setParameter( name, value, temporalType );
}
@ -356,6 +430,7 @@ public class QueryImpl implements Query, HibernateQuery {
else if ( temporalType == TIMESTAMP ) {
query.setTimestamp( position - 1, value );
}
registerParameterBinding( getParameter( position ), value );
}
return this;
}
@ -363,14 +438,16 @@ public class QueryImpl implements Query, HibernateQuery {
throw new IllegalArgumentException( e );
}
catch (HibernateException he) {
em.throwPersistenceException( he );
return null;
throw getEntityManager().convert( he );
}
}
public Query setParameter(int position, Calendar value, TemporalType temporalType) {
/**
* {@inheritDoc}
*/
public TypedQuery<X> setParameter(int position, Calendar value, TemporalType temporalType) {
try {
if ( isPositionalParameter() ) {
if ( isJpaPositionalParameter( position ) ) {
String name = Integer.toString( position );
this.setParameter( name, value, temporalType );
}
@ -384,6 +461,7 @@ public class QueryImpl implements Query, HibernateQuery {
else if ( temporalType == TIMESTAMP ) {
query.setCalendar( position - 1, value );
}
registerParameterBinding( getParameter( position ), value );
}
return this;
}
@ -391,83 +469,117 @@ public class QueryImpl implements Query, HibernateQuery {
throw new IllegalArgumentException( e );
}
catch (HibernateException he) {
em.throwPersistenceException( he );
return null;
throw getEntityManager().convert( he );
}
}
//FIXME
/**
* {@inheritDoc}
*/
public Set<Parameter<?>> getParameters() {
return null; //To change body of implemented methods use File | Settings | File Templates.
return parameters;
}
//FIXME
/**
* {@inheritDoc}
*/
public Parameter<?> getParameter(String name) {
return null; //To change body of implemented methods use File | Settings | File Templates.
if ( name == null ) {
throw new IllegalArgumentException( "Name of parameter to locate cannot be null" );
}
for ( Parameter parameter : parameters ) {
if ( name.equals( parameter.getName() ) ) {
return parameter;
}
}
throw new IllegalArgumentException( "Unable to locate parameter named [" + name + "]" );
}
//FIXME
/**
* {@inheritDoc}
*/
public Parameter<?> getParameter(int position) {
return null; //To change body of implemented methods use File | Settings | File Templates.
if ( isJpaPositionalParameter( position ) ) {
return getParameter( Integer.toString( position ) );
}
else {
for ( Parameter parameter : parameters ) {
if ( parameter.getPosition() != null && position == parameter.getPosition() ) {
return parameter;
}
}
throw new IllegalArgumentException( "Unable to locate parameter with position [" + position + "]" );
}
}
//FIXME
/**
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public <T> Parameter<T> getParameter(String name, Class<T> type) {
return null; //To change body of implemented methods use File | Settings | File Templates.
Parameter param = getParameter( name );
if ( param.getJavaType() != null ) {
// we were able to determine the expected type during analysis, so validate it here
throw new IllegalArgumentException(
"Parameter type [" + param.getJavaType().getName() +
"] is not assignment compatible with requested type [" +
type.getName() + "]"
);
}
return param;
}
//FIXME
/**
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public <T> Parameter<T> getParameter(int position, Class<T> type) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
//FIXME
public boolean isBound(Parameter<?> param) {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
//FIXME
public <T> T getParameterValue(Parameter<T> param) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
//FIXME
public Object getParameterValue(String name) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
//FIXME
public Object getParameterValue(int position) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public Query setFlushMode(FlushModeType flushMode) {
if ( flushMode == FlushModeType.AUTO ) {
query.setFlushMode( FlushMode.AUTO );
Parameter param = getParameter( position );
if ( param.getJavaType() != null ) {
// we were able to determine the expected type during analysis, so validate it here
throw new IllegalArgumentException(
"Parameter type [" + param.getJavaType().getName() +
"] is not assignment compatible with requested type [" +
type.getName() + "]"
);
}
else if ( flushMode == FlushModeType.COMMIT ) {
query.setFlushMode( FlushMode.COMMIT );
}
return this;
return param;
}
public FlushModeType getFlushMode() {
//FIXME
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public Query setLockMode(LockModeType lockModeType) {
//FIXME
return null; //To change body of implemented methods use File | Settings | File Templates.
/**
* {@inheritDoc}
*/
public TypedQuery<X> setLockMode(LockModeType lockModeType) {
// TODO : aye aye aye
throw new UnsupportedOperationException( "Not yet implemented" );
}
/**
* {@inheritDoc}
*/
public LockModeType getLockMode() {
//FIXME
return null; //To change body of implemented methods use File | Settings | File Templates.
return LockModeType.NONE;
}
/**
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
public <T> T unwrap(Class<T> tClass) {
//FIXME
return null; //To change body of implemented methods use File | Settings | File Templates.
if ( org.hibernate.Query.class.isAssignableFrom( tClass ) ) {
return (T) query;
}
else {
try {
return (T) this;
}
catch ( ClassCastException cce ) {
PersistenceException pe = new PersistenceException(
"Unsupported unwrap target type [" + tClass.getName() + "]"
);
getEntityManager().handlePersistenceException( pe );
throw pe;
}
}
}
}