You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.2 KiB
105 lines
3.2 KiB
/* |
|
* 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 com.fr.third.org.hibernate.jpa.criteria.expression; |
|
|
|
import java.io.Serializable; |
|
|
|
import com.fr.third.org.hibernate.jpa.criteria.CriteriaBuilderImpl; |
|
import com.fr.third.org.hibernate.jpa.criteria.ParameterRegistry; |
|
import com.fr.third.org.hibernate.jpa.criteria.ValueHandlerFactory; |
|
import com.fr.third.org.hibernate.jpa.criteria.compile.RenderingContext; |
|
|
|
/** |
|
* Represents a literal expression. |
|
* |
|
* @author Steve Ebersole |
|
*/ |
|
public class LiteralExpression<T> extends ExpressionImpl<T> implements Serializable { |
|
private Object literal; |
|
|
|
@SuppressWarnings({ "unchecked" }) |
|
public LiteralExpression(CriteriaBuilderImpl criteriaBuilder, T literal) { |
|
this( criteriaBuilder, (Class<T>) determineClass( literal ), literal ); |
|
} |
|
|
|
private static Class determineClass(Object literal) { |
|
return literal == null ? null : literal.getClass(); |
|
} |
|
|
|
public LiteralExpression(CriteriaBuilderImpl criteriaBuilder, Class<T> type, T literal) { |
|
super( criteriaBuilder, type ); |
|
this.literal = literal; |
|
} |
|
|
|
@SuppressWarnings({ "unchecked" }) |
|
public T getLiteral() { |
|
return (T) literal; |
|
} |
|
|
|
public void registerParameters(ParameterRegistry registry) { |
|
// nothing to do |
|
} |
|
|
|
@SuppressWarnings({ "unchecked" }) |
|
public String render(RenderingContext renderingContext) { |
|
if ( ValueHandlerFactory.isNumeric( literal ) ) { |
|
return ValueHandlerFactory.determineAppropriateHandler( (Class) literal.getClass() ).render( literal ); |
|
} |
|
else if ( ValueHandlerFactory.isBoolean( literal ) ) { |
|
return ValueHandlerFactory.determineAppropriateHandler( (Class) literal.getClass() ).render( literal ); |
|
} |
|
|
|
// else... |
|
final String parameterName = renderingContext.registerLiteralParameterBinding( getLiteral(), getJavaType() ); |
|
return ':' + parameterName; |
|
} |
|
|
|
/** |
|
* Inline String literal. |
|
* |
|
* @return escaped String |
|
*/ |
|
private String inlineLiteral(String literal) { |
|
return String.format("\'%s\'", escapeLiteral(literal)); |
|
} |
|
|
|
/** |
|
* Escape String literal. |
|
* |
|
* @return escaped String |
|
*/ |
|
private String escapeLiteral(String literal) { |
|
return literal.replace("'", "''"); |
|
} |
|
|
|
@SuppressWarnings({"unchecked"}) |
|
public String renderProjection(RenderingContext renderingContext) { |
|
if (ValueHandlerFactory.isCharacter(literal)) { |
|
// In case literal is a Character, pass literal.toString() as the argument. |
|
return inlineLiteral(literal.toString()); |
|
} |
|
// some drivers/servers do not like parameters in the select clause |
|
final ValueHandlerFactory.ValueHandler handler = |
|
ValueHandlerFactory.determineAppropriateHandler(literal.getClass()); |
|
return handler.render(literal); |
|
} |
|
|
|
@Override |
|
@SuppressWarnings({ "unchecked" }) |
|
protected void resetJavaType(Class targetType) { |
|
super.resetJavaType( targetType ); |
|
ValueHandlerFactory.ValueHandler valueHandler = getValueHandler(); |
|
if ( valueHandler == null ) { |
|
valueHandler = ValueHandlerFactory.determineAppropriateHandler( targetType ); |
|
forceConversion( valueHandler ); |
|
} |
|
|
|
if ( valueHandler != null ) { |
|
literal = valueHandler.convert( literal ); |
|
} |
|
} |
|
}
|
|
|