/* * ome.services.query.StringQuery * * Copyright 2006 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ /*------------------------------------------------------------------------------ * * Written by: Josh Moore <josh.moore@gmx.de> * *------------------------------------------------------------------------------ */ package ome.services.query; import java.sql.SQLException; import java.util.Collection; import ome.conditions.ApiUsageException; import ome.parameters.Parameters; import ome.util.SqlAction; import org.hibernate.HibernateException; import org.hibernate.Session; /** * simple HQL query. Parameters are added as named parameters ({@link org.hibernate.Query#setParameter(java.lang.String, java.lang.Object)}. * Parameters with a value of type {@link Collection} are added as * {@link org.hibernate.Query#setParameterList(java.lang.String, java.util.Collection)} * * No parsing is done until execution time. * * @author Josh Moore, <a href="mailto:josh.moore@gmx.de">josh.moore@gmx.de</a> * @since OMERO 3.0 */ public class StringQuery extends Query { /** * parameter name for the definition of the HQL string. */ public final static String STRING = "::string::"; static Definitions defs = new Definitions(new QueryParameterDef(STRING, String.class, false)); private final SqlAction sql; /** * Default constructor, used primarily for testing. * Leaves {@link SqlAction} field null preventing * query rewriting. */ public StringQuery(Parameters parameters) { this(null, parameters); } public StringQuery(SqlAction sql, Parameters parameters) { super(defs, parameters); this.sql = sql; } @Override protected void buildQuery(Session session) throws HibernateException, SQLException { String queryString = (String) value(STRING); if (sql != null) { for (String key : params.keySet()) { if (STRING.equals(key)) { continue; // Skip ::string: since its what it is. } queryString = sql.rewriteHql(queryString, key, value(key)); } } org.hibernate.Query query; try { query = session.createQuery(queryString); } catch (Exception e) { // Caused by a query parser error in Hibernate. throw new QueryException("Illegal query:" + value(STRING) + "\n" + e.getMessage()); } String[] nParams = query.getNamedParameters(); for (int i = 0; i < nParams.length; i++) { String p = nParams[i]; Object v = value(p); if (v == null) { throw new ApiUsageException("Null parameters not allowed: " + p); } if (Collection.class.isAssignableFrom(v.getClass())) { query.setParameterList(p, (Collection) v); } else { query.setParameter(p, v); } } setQuery(query); } }