/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.javaee.ejb;

import org.eclipse.jst.javaee.core.Description;
import org.eclipse.jst.javaee.core.JavaEEObject;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Query</b></em>'.
 * <!-- end-user-doc -->
 *
 * <!-- begin-model-doc -->
 * 
 * 
 *         The queryType defines a finder or select
 *         query. It contains
 *         - an optional description of the query
 *         - the specification of the finder or select
 *         method it is used by
 *         	- an optional specification of the result type 
 *         	  mapping, if the query is for a select method 
 *         	  and entity objects are returned.
 *         	- the EJB QL query string that defines the query.
 *         
 *         Queries that are expressible in EJB QL must use the ejb-ql
 *         element to specify the query. If a query is not expressible
 *         in EJB QL, the description element should be used to
 *         describe the semantics of the query and the ejb-ql element
 *         should be empty.
 *         
 *         The result-type-mapping is an optional element. It can only
 *         be present if the query-method specifies a select method
 *         that returns entity objects.  The default value for the
 *         result-type-mapping element is "Local".
 *         
 *         @since Java EE 5, EJB 3.0
 *       
 * <!-- end-model-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.jst.javaee.ejb.Query#getDescription <em>Description</em>}</li>
 *   <li>{@link org.eclipse.jst.javaee.ejb.Query#getQueryMethod <em>Query Method</em>}</li>
 *   <li>{@link org.eclipse.jst.javaee.ejb.Query#getResultTypeMapping <em>Result Type Mapping</em>}</li>
 *   <li>{@link org.eclipse.jst.javaee.ejb.Query#getEjbQl <em>Ejb Ql</em>}</li>
 *   <li>{@link org.eclipse.jst.javaee.ejb.Query#getId <em>Id</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getQuery()
 * @extends JavaEEObject
 * @generated
 */
public interface Query extends JavaEEObject {
	/**
	 * Returns the value of the '<em><b>Description</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Description</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Description</em>' containment reference.
	 * @see #setDescription(Description)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getQuery_Description()
	 * @generated
	 */
	Description getDescription();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.Query#getDescription <em>Description</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Description</em>' containment reference.
	 * @see #getDescription()
	 * @generated
	 */
	void setDescription(Description value);

	/**
	 * Returns the value of the '<em><b>Query Method</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Query Method</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Query Method</em>' containment reference.
	 * @see #setQueryMethod(QueryMethod)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getQuery_QueryMethod()
	 * @generated
	 */
	QueryMethod getQueryMethod();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.Query#getQueryMethod <em>Query Method</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Query Method</em>' containment reference.
	 * @see #getQueryMethod()
	 * @generated
	 */
	void setQueryMethod(QueryMethod value);

	/**
	 * Returns the value of the '<em><b>Result Type Mapping</b></em>' attribute.
	 * The literals are from the enumeration {@link org.eclipse.jst.javaee.ejb.ResultTypeMappingType}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Result Type Mapping</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Result Type Mapping</em>' attribute.
	 * @see org.eclipse.jst.javaee.ejb.ResultTypeMappingType
	 * @see #isSetResultTypeMapping()
	 * @see #unsetResultTypeMapping()
	 * @see #setResultTypeMapping(ResultTypeMappingType)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getQuery_ResultTypeMapping()
	 * @generated
	 */
	ResultTypeMappingType getResultTypeMapping();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.Query#getResultTypeMapping <em>Result Type Mapping</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Result Type Mapping</em>' attribute.
	 * @see org.eclipse.jst.javaee.ejb.ResultTypeMappingType
	 * @see #isSetResultTypeMapping()
	 * @see #unsetResultTypeMapping()
	 * @see #getResultTypeMapping()
	 * @generated
	 */
	void setResultTypeMapping(ResultTypeMappingType value);

	/**
	 * Unsets the value of the '{@link org.eclipse.jst.javaee.ejb.Query#getResultTypeMapping <em>Result Type Mapping</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isSetResultTypeMapping()
	 * @see #getResultTypeMapping()
	 * @see #setResultTypeMapping(ResultTypeMappingType)
	 * @generated
	 */
	void unsetResultTypeMapping();

	/**
	 * Returns whether the value of the '{@link org.eclipse.jst.javaee.ejb.Query#getResultTypeMapping <em>Result Type Mapping</em>}' attribute is set.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return whether the value of the '<em>Result Type Mapping</em>' attribute is set.
	 * @see #unsetResultTypeMapping()
	 * @see #getResultTypeMapping()
	 * @see #setResultTypeMapping(ResultTypeMappingType)
	 * @generated
	 */
	boolean isSetResultTypeMapping();

	/**
	 * Returns the value of the '<em><b>Ejb Ql</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Ejb Ql</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Ejb Ql</em>' attribute.
	 * @see #setEjbQl(String)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getQuery_EjbQl()
	 * @generated
	 */
	String getEjbQl();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.Query#getEjbQl <em>Ejb Ql</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Ejb Ql</em>' attribute.
	 * @see #getEjbQl()
	 * @generated
	 */
	void setEjbQl(String value);

	/**
	 * Returns the value of the '<em><b>Id</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Id</em>' attribute.
	 * @see #setId(String)
	 * @see org.eclipse.jst.javaee.ejb.internal.metadata.EjbPackage#getQuery_Id()
	 * @generated
	 */
	String getId();

	/**
	 * Sets the value of the '{@link org.eclipse.jst.javaee.ejb.Query#getId <em>Id</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Id</em>' attribute.
	 * @see #getId()
	 * @generated
	 */
	void setId(String value);

} // Query