/* * 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; /** * A problem occurred translating a Hibernate query to SQL due to invalid query syntax, etc. */ public class QueryException extends HibernateException { private final String queryString; /** * Constructs a QueryException using the specified exception message. * * @param message A message explaining the exception condition */ public QueryException(String message) { this( message, null, null ); } /** * Constructs a QueryException using the specified exception message and cause. * * @param message A message explaining the exception condition * @param cause The underlying cause */ public QueryException(String message, Exception cause) { this( message, null, cause ); } /** * Constructs a QueryException using the specified exception message and query-string. * * @param message A message explaining the exception condition * @param queryString The query being evaluated when the exception occurred */ public QueryException(String message, String queryString) { this( message, queryString, null ); } /** * Constructs a QueryException using the specified exception message and query-string. * * @param message A message explaining the exception condition * @param queryString The query being evaluated when the exception occurred * @param cause The underlying cause */ public QueryException(String message, String queryString, Exception cause) { super( message, cause ); this.queryString = queryString; } /** * Constructs a QueryException using the specified cause. * * @param cause The underlying cause */ public QueryException(Exception cause) { this( "A query exception occurred", null, cause ); } /** * Retrieve the query being evaluated when the exception occurred. May be null, but generally should not. * * @return The query string */ public String getQueryString() { return queryString; } @Override public String getMessage() { String msg = getOriginalMessage(); if ( queryString != null ) { msg += " [" + queryString + ']'; } return msg; } protected final String getOriginalMessage() { return super.getMessage(); } /** * Wraps this exception with another, of same kind, with the specified queryString. If this exception already * has a queryString defined, the same exception ({@code this}) is returned. Otherwise the protected * {@link #generateQueryException(String)} is called, to allow subclasses to properly create the correct * subclass for return. * * @param queryString The query string that led to the QueryException * * @return {@code this}, if {@code this} has {@code null} for {@link #getQueryString()}; otherwise a new * QueryException (or subclass) is returned. */ public final QueryException wrapWithQueryString(String queryString) { if ( this.getQueryString() != null ) { return this; } return generateQueryException( queryString ); } /** * Called from {@link #wrapWithQueryString(String)} when we really need to generate a new QueryException * (or subclass). * <p/> * NOTE : implementors should take care to use {@link #getOriginalMessage()} for the message, not * {@link #getMessage()} * * @param queryString The query string * * @return The generated QueryException (or subclass) * * @see #getOriginalMessage() */ protected QueryException generateQueryException(String queryString) { return new QueryException( getOriginalMessage(), queryString, this ); } }