blob: a98386a516978621e95358828e52852e54571480 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2009 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* dclarke - initial JPA Employee example using XML (bug 217884)
******************************************************************************/
package example;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import model.Employee;
import model.Gender;
import org.eclipse.persistence.config.QueryHints;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.internal.jpa.EJBQueryImpl;
import org.eclipse.persistence.internal.jpa.EntityManagerImpl;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.queries.FetchGroup;
import org.eclipse.persistence.queries.QueryByExamplePolicy;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.ReadObjectQuery;
/**
* Simple query examples for the XML mapped Employee domain model.
*
* @author dclarke
* @since EclipseLink 1.1
*/
@SuppressWarnings("unchecked")
public class Queries {
/**
* Simple example using dynamic JP QL to retrieve all Employee instances
* sorted by lastName and firstName.
*/
public List<Employee> readAllEmployeesUsingJPQL(EntityManager em) {
return em.createQuery("SELECT e FROM Employee e ORDER BY e.lastName ASC, e.firstName ASC").getResultList();
}
public List<Employee> joinFetchJPQL(EntityManager em) {
return em.createQuery("SELECT e FROM Employee e JOIN FETCH e.address ORDER BY e.lastName ASC, e.firstName ASC").getResultList();
}
public List<Employee> joinFetchHint(EntityManager em) {
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.manager.address.city = 'Ottawa' ORDER BY e.lastName ASC, e.firstName ASC");
query.setHint(QueryHints.FETCH, "e.address");
query.setHint(QueryHints.FETCH, "e.manager");
query.setHint(QueryHints.FETCH, "e.manager.address");
query.setHint(QueryHints.BATCH, "e.manager.phoneNumbers");
List<Employee> emps = query.getResultList();
for (Employee emp : emps) {
emp.getManager().getPhoneNumbers().size();
}
return emps;
}
/**
*
* @param em
* @return
*/
public static int minimumEmployeeId(EntityManager em) {
return ((Number) em.createQuery("SELECT MIN(e.id) FROM Employee e").getSingleResult()).intValue();
}
public Employee minimumEmployee(EntityManager em) {
Query q = em.createQuery("SELECT e FROM Employee e WHERE e.id in (SELECT MIN(ee.id) FROM Employee ee)");
return (Employee) q.getSingleResult();
}
public List<Employee> findEmployeesUsingGenderIn(EntityManager em) {
return em.createQuery("SELECT e FROM Employee e WHERE e.gender IN (:GENDER1, :GENDER2)").setParameter("GENDER1", Gender.Male).setParameter("GENDER2", Gender.Female).getResultList();
}
public List<Employee> findUsingNativeReadAllQuery(EntityManager em) {
ReadAllQuery raq = new ReadAllQuery(Employee.class);
ExpressionBuilder eb = raq.getExpressionBuilder();
raq.setSelectionCriteria(eb.get("gender").equal(Gender.Male));
Query query = JpaHelper.createQuery(raq, em);
return query.getResultList();
}
/**
* Example of EclipseLink's native query-by-example support.
*
* @param em
* @param sampleEmployee
* @return
*/
public Employee queryByExample(EntityManager em, Employee sampleEmployee) {
QueryByExamplePolicy policy = new QueryByExamplePolicy();
policy.excludeDefaultPrimitiveValues();
ReadObjectQuery roq = new ReadObjectQuery(sampleEmployee, policy);
// Wrap the native query in a JPA Query and execute it.
Query query = new EJBQueryImpl<Employee>(roq, (EntityManagerImpl) JpaHelper.getEntityManager(em));
return (Employee) query.getSingleResult();
}
public static Employee minEmployeeWithAddressAndPhones(EntityManager em) {
return (Employee) em.createQuery("SELECT e FROM Employee e JOIN FETCH e.address WHERE e.id IN (SELECT MIN(p.id) FROM PhoneNumber p)").getSingleResult();
}
public Employee minEmployeeWithManagerWithAddress(EntityManager em) {
List<Employee> emps = em.createQuery("SELECT e FROM Employee e JOIN FETCH e.manager WHERE e.manager.address IS NOT NULL ORDER BY e.id").getResultList();
return emps.get(0);
}
public static int minEmployeeIdWithAddressAndPhones(EntityManager em) {
return ((Number) em.createQuery("SELECT e.id FROM Employee e JOIN FETCH e.address WHERE e.id IN (SELECT MIN(p.id) FROM PhoneNumber p)").getSingleResult()).intValue();
}
public List<Employee> fetchGroupExample(EntityManager em) {
Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.id");
FetchGroup fetchGroup = new FetchGroup();
fetchGroup.addAttribute("id");
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
query.setHint(QueryHints.FETCH_GROUP, fetchGroup);
return query.getResultList();
}
}