OPENJPA-1013: check in strictly-typed criteria test cases.

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@773314 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Fay Wang 2009-05-10 08:25:24 +00:00
parent 3213665811
commit c0bf7e40d6
48 changed files with 2427 additions and 74 deletions

View File

@ -30,7 +30,7 @@ import javax.persistence.Table;
*
*/
@Entity
@Table(name="CR_ACCOUNT")
@Table(name="CR_ACCT")
public class Account {
@Id
@GeneratedValue
@ -40,4 +40,40 @@ public class Account {
private Integer loan;
private String owner;
private String name;
public long getId() {
return id;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBalance() {
return balance;
}
public void setBalancey(int balance) {
this.balance = balance;
}
public Integer getLoan() {
return loan;
}
public void setLoan(Integer loan) {
this.loan = loan;
}
}

View File

@ -33,14 +33,69 @@ import javax.persistence.Table;
*
*/
@Entity
@Table(name="CR_ADDRESS")
@Table(name="CR_ADDR")
@Embeddable
public class Address {
@Id
@GeneratedValue
private long id;
private String street;
private String city;
private String state;
private String county;
private String country;
private String zipCode;
public long getId() {
return id;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZipcode() {
return zipCode;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public void setZipcode(String zipCode) {
this.zipCode = zipCode;
}
}

View File

@ -0,0 +1,19 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Address.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Address_ {
public static volatile Attribute<Address,String> city;
public static volatile Attribute<Address,String> country;
public static volatile Attribute<Address,String> county;
public static volatile Attribute<Address,Long> id;
public static volatile Attribute<Address,String> state;
public static volatile Attribute<Address,String> street;
public static volatile Attribute<Address,String> zipCode;
}

View File

@ -31,4 +31,20 @@ public class Contact {
@OneToMany
private List<Phone> phones;
public List<Phone> getPhones() {
return phones;
}
public void addPhone(Phone phone) {
phones.add(phone);
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}

View File

@ -0,0 +1,15 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.List;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Contact.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Contact_ {
public static volatile Attribute<Contact,Address> address;
public static volatile List<Contact,Phone> phones;
}

View File

@ -20,6 +20,7 @@ package org.apache.openjpa.persistence.criteria;
import javax.persistence.Entity;
@Entity
public class Contractor extends Person {
}

View File

@ -0,0 +1,11 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Contractor.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Contractor_ extends Person_ {
}

View File

@ -21,17 +21,47 @@ package org.apache.openjpa.persistence.criteria;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
@Entity
@Table(name="CR_COURSE")
@Table(name="CR_CRSE")
public class Course {
@Id
@GeneratedValue
private long id;
private String name;
@OneToMany
@OrderBy
private List<Student> studentWaitList;
public long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Student> getStudentWaitList() {
return studentWaitList;
}
public void setStudentWaitList(List<Student> studentWaitList) {
this.studentWaitList = studentWaitList;
}
public void addStudentToWaitList(Student student) {
studentWaitList.add(student);
}
}

View File

@ -0,0 +1,16 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.List;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Course.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Course_ {
public static volatile Attribute<Course,Long> id;
public static volatile Attribute<Course,String> name;
public static volatile List<Course,Student> studentWaitList;
}

View File

@ -21,19 +21,48 @@ package org.apache.openjpa.persistence.criteria;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
@Entity
@Table(name="CR_CREDITCARD")
@Table(name="CR_CRDTC")
public class CreditCard {
@Id
@GeneratedValue
private long id;
@OneToOne
private Employee holder;
private Customer customer;
@OneToMany
@OrderBy
private List<Transaction> transactionHistory;
private List<TransactionHistory> transactionHistory;
public long getId() {
return id;
}
public List<TransactionHistory> getTransactionHistory() {
return transactionHistory;
}
public void setTransactionHistory(List<TransactionHistory> transactionHistory) {
this.transactionHistory = transactionHistory;
}
public void addTransactionHistory(TransactionHistory transaction) {
transactionHistory.add(transaction);
}
public Customer getCustomer() {
return customer;
}
public void setCustomerr(Customer customer) {
this.customer = customer;
}
}

View File

@ -0,0 +1,16 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.List;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.CreditCard.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class CreditCard_ {
public static volatile Attribute<CreditCard,Customer> customer;
public static volatile Attribute<CreditCard,Long> id;
public static volatile List<CreditCard,TransactionHistory> transactionHistory;
}

View File

@ -18,39 +18,132 @@
*/
package org.apache.openjpa.persistence.criteria;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="CR_CUSTOMER")
@Table(name="CR_CUST")
public class Customer {
@Id
@GeneratedValue
private long id;
private String firstName;
private String lastName;
private String name;
@OneToMany
private Set<Order> orders;
private Set<Order> orders = new HashSet<Order>();
private int status;
private int balanceOwned;
private int balanceOwed;
@OneToOne
private Address address;
private int filledOrderCount;
private String country;
private long accountNum;
@OneToMany
private List<Account> accounts;
public Customer() {
private List<Account> accounts = new ArrayList<Account>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
public long getId() {
return id;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public long getAccountNum() {
return accountNum;
}
public void setAccountNum(long accountNum) {
this.accountNum = accountNum;
}
public int getBalanceOwed() {
return balanceOwed;
}
public void setBalanceOwed(int balanceOwed) {
this.balanceOwed = balanceOwed;
}
public int getFilledOrderCount() {
return filledOrderCount;
}
public void setFilledOrderCount(int filledOrderCount) {
this.filledOrderCount = filledOrderCount;
}
public List<Account> getAccounts() {
return accounts;
}
public void setAccounts(List<Account> accounts) {
this.accounts = accounts;
}
public Customer(long id, int status, int count) {
}

View File

@ -0,0 +1,53 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.criteria;
public class CustomerDetails {
int id;
int status;
int quantity;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}

View File

@ -0,0 +1,25 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.List;
import javax.persistence.metamodel.Set;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Customer.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Customer_ {
public static volatile Attribute<Customer,Long> accountNum;
public static volatile List<Customer,Account> accounts;
public static volatile Attribute<Customer,Address> address;
public static volatile Attribute<Customer,Integer> balanceOwed;
public static volatile Attribute<Customer,Integer> filledOrderCount;
public static volatile Attribute<Customer,String> firstName;
public static volatile Attribute<Customer,Long> id;
public static volatile Attribute<Customer,String> lastName;
public static volatile Attribute<Customer,String> name;
public static volatile Set<Customer,Order> orders;
public static volatile Attribute<Customer,Integer> status;
}

View File

@ -21,15 +21,44 @@ package org.apache.openjpa.persistence.criteria;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="CR_DEPARTMENT")
@Table(name="CR_DEPT")
public class Department {
@Id
@GeneratedValue
private int deptNo;
private String name;
@OneToMany
private Set<Employee> employees;
public int getDeptno() {
return deptNo;
}
public void setDeptno(int deptNo) {
this.deptNo = deptNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees){
this.employees = employees;
}
}

View File

@ -0,0 +1,16 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Set;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Department.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Department_ {
public static volatile Attribute<Department,Integer> deptNo;
public static volatile Set<Department,Employee> employees;
public static volatile Attribute<Department,String> name;
}

View File

@ -18,29 +18,104 @@
*/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.Basic;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="CR_EMPLOYEE")
@Table(name="CR_EMP")
@Inheritance
@DiscriminatorColumn(name="EMP_TYPE")
public class Employee {
@Id
@GeneratedValue
private int empId;
private String name;
@Embedded
private Contact contactInfo;
@ManyToOne
private Department department;
private int rating;
private float salary;
@OneToOne
private Employee spouse;
@ManyToOne
private Manager manager;
@OneToOne
FrequentFlierPlan frequentFlierPlan;
private FrequentFlierPlan frequentFlierPlan;
@Basic
private long salary;
@Basic
private int rating;
public int getEmpId() {
return empId;
}
public void setContactInfo(Contact contactInfo) {
this.contactInfo = contactInfo;
}
public Contact getContactInfo() {
return contactInfo;
}
public void setDepartment(Department department) {
this.department = department;
}
public Department getDepartment() {
return department;
}
public void setSpouse(Employee spouse) {
this.spouse = spouse;
}
public Employee getSpouse() {
return spouse;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setManager(Manager manager) {
this.manager = manager;
}
public Manager getManager() {
return manager;
}
public void setSalary(long salary) {
this.salary = salary;
}
public long getSalary() {
return salary;
}
public void setRating(int rating) {
this.rating = rating;
}
public long getRating() {
return rating;
}
}

View File

@ -0,0 +1,21 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Employee.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Employee_ {
public static volatile Attribute<Employee,Contact> contactInfo;
public static volatile Attribute<Employee,Department> department;
public static volatile Attribute<Employee,Integer> empId;
public static volatile Attribute<Employee,FrequentFlierPlan> frequentFlierPlan;
public static volatile Attribute<Employee,Manager> manager;
public static volatile Attribute<Employee,String> name;
public static volatile Attribute<Employee,Integer> rating;
public static volatile Attribute<Employee,Long> salary;
public static volatile Attribute<Employee,Employee> spouse;
}

View File

@ -18,17 +18,22 @@
*/
package org.apache.openjpa.persistence.criteria;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="CR_EXEMPT")
public class Exempt extends Employee {
@Basic
private Date hireDate;
public class Exempt {
@Id
@GeneratedValue
private String id;
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
public Date getHireDate() {
return hireDate;
}
}

View File

@ -0,0 +1,14 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import java.util.Date;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Exempt.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Exempt_ extends Employee_ {
public static volatile Attribute<Exempt,Date> hireDate;
}

View File

@ -21,15 +21,50 @@ package org.apache.openjpa.persistence.criteria;
import java.util.Map;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="CR_ITEM")
public class Item {
@Id
@GeneratedValue
private int id;
private String name;
@OneToMany
private Map<String, Photo> photos;
public long getId() {
return id;
}
public Map<String, Photo> getPhotos() {
return photos;
}
public void addPhoto(String name, Photo photo) {
photos.put(name, photo);
}
public void removePhoto(String name) {
photos.remove(name);
}
public Photo getPhoto(String name) {
return photos.get(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -0,0 +1,16 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Map;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Item.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Item_ {
public static volatile Attribute<Item,Integer> id;
public static volatile Attribute<Item,String> name;
public static volatile Map<Item,String,Photo> photos;
}

View File

@ -19,14 +19,74 @@
package org.apache.openjpa.persistence.criteria;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="CR_LINEITEM")
@Table(name="CR_LI")
public class LineItem {
private int price;
@Id
@GeneratedValue
private int id;
private double price;
@ManyToOne
private Order order;
private int quantity;
private double cost;
@ManyToOne (fetch=FetchType.EAGER)
Product product;
public long getId() {
return id;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getCost() {
return cost;
}
public void setCost(double cost) {
this.cost = cost;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}

View File

@ -0,0 +1,18 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.LineItem.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class LineItem_ {
public static volatile Attribute<LineItem,Double> cost;
public static volatile Attribute<LineItem,Integer> id;
public static volatile Attribute<LineItem,Order> order;
public static volatile Attribute<LineItem,Double> price;
public static volatile Attribute<LineItem,Product> product;
public static volatile Attribute<LineItem,Integer> quantity;
}

View File

@ -18,11 +18,54 @@
*/
package org.apache.openjpa.persistence.criteria;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="CR_MGR")
public class Manager {
@Id
@GeneratedValue
private int id;
private String name;
private BigDecimal salary;
@ManyToOne
private Department department;
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setDepartment(Department department) {
this.department = department;
}
public Department getDepartment() {
return department;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public class Manager extends Employee {
private String cabin;
}

View File

@ -0,0 +1,17 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import java.math.BigDecimal;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Manager.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Manager_ {
public static volatile Attribute<Manager,Department> department;
public static volatile Attribute<Manager,Integer> id;
public static volatile Attribute<Manager,String> name;
public static volatile Attribute<Manager,BigDecimal> salary;
}

View File

@ -0,0 +1,43 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.*;
@Entity
@Table(name="CR_MV")
public class Movie {
@Id
@GeneratedValue
private int id;
private String title;
public long getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}

View File

@ -0,0 +1,14 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Movie.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Movie_ {
public static volatile Attribute<Movie,Integer> id;
public static volatile Attribute<Movie,String> title;
}

View File

@ -21,21 +21,64 @@ package org.apache.openjpa.persistence.criteria;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="CR_ORDER")
@Table(name="CR_ODR")
public class Order {
@Id
@GeneratedValue
private int id;
private int quantity;
private int cost;
private int totalcost;
private double totalCost;
private int count;
@ManyToOne
private Customer customer;
@OneToMany(mappedBy="order")
private List<LineItem> lineItems;
public double getTotalCost() {
return totalCost;
}
public void setTotalCost(double totalCost) {
this.totalCost = totalCost;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public int getId() {
return id;
}
public List<LineItem> getLineItems() {
return lineItems;
}
public void setLineitems(List<LineItem> lineItems) {
this.lineItems = lineItems;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}

View File

@ -0,0 +1,19 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.List;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Order.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Order_ {
public static volatile Attribute<Order,Integer> count;
public static volatile Attribute<Order,Customer> customer;
public static volatile Attribute<Order,Integer> id;
public static volatile List<Order,LineItem> lineItems;
public static volatile Attribute<Order,Integer> quantity;
public static volatile Attribute<Order,Double> totalCost;
}

View File

@ -18,22 +18,48 @@
*/
package org.apache.openjpa.persistence.criteria;
import java.util.List;
import java.util.Set;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.apache.openjpa.persistence.PersistentCollection;
@Entity
@Table(name="CR_PERSON")
@Table(name="CR_PSN")
public class Person {
@Id
private long ssn;
@GeneratedValue
private int id;
@PersistentCollection
private List<String> nicknames;
private String name;
@ElementCollection
private Set<String> nickNames;
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<String> getNickNames() {
return nickNames;
}
public void setNickNames(Set<String> nickNames) {
this.nickNames = nickNames;
}
public void addNickName(String nickName) {
nickNames.add(nickName);
}
}

View File

@ -0,0 +1,16 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Set;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Person.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Person_ {
public static volatile Attribute<Person,Integer> id;
public static volatile Attribute<Person,String> name;
public static volatile Set<Person,String> nickNames;
}

View File

@ -18,12 +18,44 @@
*/
package org.apache.openjpa.persistence.criteria;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="CR_PHONE")
@Table(name="CR_PHN")
public class Phone {
@Id
@GeneratedValue
private int id;
@ManyToMany
private Collection<Employee> employees = new ArrayList<Employee>();
private String vendor;
public int getId() {
return id;
}
public Collection<Employee> getEmployees() {
return employees;
}
public void addEmployees(Employee employee) {
employees.add(employee);
}
public String getVendor() {
return vendor;
}
public void setVendor(String vendor) {
this.vendor = vendor;
}
}

View File

@ -0,0 +1,16 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Collection;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Phone.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Phone_ {
public static volatile Collection<Phone,Employee> employees;
public static volatile Attribute<Phone,Integer> id;
public static volatile Attribute<Phone,String> vendor;
}

View File

@ -19,11 +19,29 @@
package org.apache.openjpa.persistence.criteria;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="CR_PHOTO")
@Table(name="CR_PHT")
public class Photo {
@Id
@GeneratedValue
private int id;
private String label;
public int getId() {
return id;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}

View File

@ -0,0 +1,14 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Photo.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Photo_ {
public static volatile Attribute<Photo,Integer> id;
public static volatile Attribute<Photo,String> label;
}

View File

@ -0,0 +1,44 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.*;
@Entity
public class Product {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int pid;
private String productType;
@Version
private long version;
public String getProductType() {
return productType;
}
public void setProductType(String productType) {
this.productType = productType;
}
public int getPid() {
return pid;
}
}

View File

@ -0,0 +1,15 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Product.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Product_ {
public static volatile Attribute<Product,Integer> pid;
public static volatile Attribute<Product,String> productType;
public static volatile Attribute<Product,Long> version;
}

View File

@ -0,0 +1,46 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="CR_SMT")
public class Semester {
@Id
@GeneratedValue
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -0,0 +1,14 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Semester.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Semester_ {
public static volatile Attribute<Semester,Integer> id;
public static volatile Attribute<Semester,String> name;
}

View File

@ -18,16 +18,54 @@
*/
package org.apache.openjpa.persistence.criteria;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.MapKeyJoinColumn;
import javax.persistence.Table;
@Entity
@Table(name="CR_STUDENT")
@Table(name="CR_STU")
public class Student {
@Id
@GeneratedValue
private int id;
private String name;
@ManyToMany
@JoinTable(name="ENROLLMENTS",
joinColumns=@JoinColumn(name="STUDENT"),
inverseJoinColumns=@JoinColumn(name="SEMESTER"))
@MapKeyJoinColumn(name="COURSE")
private Map<Course, Semester> enrollment =
new HashMap<Course, Semester>();
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map getEnrollment() {
return enrollment;
}
public void addToEnrollment(Course course, Semester semester) {
enrollment.put(course, semester);
}
}

View File

@ -0,0 +1,16 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Map;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.Student.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class Student_ {
public static volatile Map<Student,Course,Semester> enrollment;
public static volatile Attribute<Student,Integer> id;
public static volatile Attribute<Student,String> name;
}

View File

@ -0,0 +1,606 @@
package org.apache.openjpa.persistence.criteria;
import java.math.BigDecimal;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.ListJoin;
import javax.persistence.criteria.MapJoin;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import javax.persistence.metamodel.Embeddable;
import javax.persistence.metamodel.Entity;
import javax.persistence.metamodel.Metamodel;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.persistence.test.AllowFailure;
import org.apache.openjpa.persistence.test.SQLListenerTestCase;
public class TestMetaModelTypesafeCriteria extends SQLListenerTestCase {
protected Entity<Account> account_ = null;
protected Embeddable<Address> address_ = null;
protected Embeddable<Contact> contact_ = null;
protected Entity<Course> course_ = null;
protected Entity<CreditCard> creditCard_ = null;
protected Entity<Customer> customer_ = null;
protected Entity<Department> department_ = null;
protected Entity<Employee> employee_ = null;
protected Entity<Exempt> exempt_ = null;
protected Entity<Item> item_ = null;
protected Entity<LineItem> lineItem_ = null;
protected Entity<Manager> manager_ = null;
protected Entity<Movie> movie_ = null;
protected Entity<Order> order_ = null;
protected Entity<Person> person_ = null;
protected Entity<Phone> phone_ = null;
protected Entity<Photo> photo_ = null;
protected Entity<Product> product_ = null;
protected Entity<Semester> semester_ = null;
protected Entity<Student> student_ = null;
protected Entity<TransactionHistory> transactionHistory_ = null;
protected Entity<VideoStore> videoStore_ = null;
CriteriaBuilder cb;
EntityManager em;
public void setUp() {
super.setUp(DROP_TABLES,
Account.class,
Address.class,
Contact.class,
Contractor.class,
Course.class,
CreditCard.class,
Customer.class,
Department.class,
Employee.class,
Exempt.class,
FrequentFlierPlan.class,
Item.class,
LineItem.class,
Manager.class,
Movie.class,
Person.class,
Product.class,
Order.class,
Phone.class,
Photo.class,
Semester.class,
Student.class,
TransactionHistory.class,
VideoStore.class);
setDictionary();
cb = (CriteriaBuilder)emf.getQueryBuilder();
em = emf.createEntityManager();
Metamodel mm = em.getMetamodel();
account_ = mm.entity(Account.class);
address_ = mm.embeddable(Address.class);
contact_ = mm.embeddable(Contact.class);
course_ = mm.entity(Course.class);
creditCard_ = mm.entity(CreditCard.class);
customer_ = mm.entity(Customer.class);
department_ = mm.entity(Department.class);
employee_ = mm.entity(Employee.class);
exempt_ = mm.entity(Exempt.class);
item_ = mm.entity(Item.class);
lineItem_ = mm.entity(LineItem.class);
manager_ = mm.entity(Manager.class);
movie_ = mm.entity(Movie.class);
order_ = mm.entity(Order.class);
person_ = mm.entity(Person.class);
phone_ = mm.entity(Phone.class);
photo_ = mm.entity(Photo.class);
product_ = mm.entity(Product.class);
semester_ = mm.entity(Semester.class);
student_ = mm.entity(Student.class);
transactionHistory_ = mm.entity(TransactionHistory.class);
videoStore_ = mm.entity(VideoStore.class);
}
void setDictionary() {
JDBCConfiguration conf = (JDBCConfiguration)emf.getConfiguration();
DBDictionary dict = conf.getDBDictionaryInstance();
dict.requiresCastForComparisons = false;
dict.requiresCastForMathFunctions = false;
}
public void createObj() {
}
@AllowFailure
public void testCriteria() {
String jpql = "select c from Customer c where c.name='Autowest Toyota'";
CriteriaQuery q = cb.create();
Root<Customer> customer = q.from(Customer.class);
q = cb.create();
q.select(customer).where(cb.equal(
customer.get(customer_.getAttribute("name", String.class)),
"Autowest Toyota"));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testJoins() {
String jpql = "SELECT c.name FROM Customer c JOIN c.orders o " +
"JOIN o.lineItems i WHERE i.product.productType = 'printer'";
CriteriaQuery q = cb.create();
Root<Customer> cust = q.from(Customer.class);
Join<Customer, Order> order = cust.join(customer_.getSet("orders",
Order.class));
Join<Order, LineItem> item = order.join(order_.getList("lineItems",
LineItem.class));
q.select(cust.get(Customer_.name))
.where(cb.equal(
item.get(lineItem_.getAttribute("product", Product.class)).
get(product_.getAttribute("productType", String.class)),
"printer"));
assertEquivalence(q, jpql);
jpql = "SELECT c FROM Customer c LEFT JOIN c.orders o WHERE " +
"c.status = 1";
q = cb.create();
Root<Customer> cust1 = q.from(Customer.class);
Join<Customer, Order> order1 = cust1.join(customer_.getSet("orders",
Order.class), JoinType.LEFT);
q.where(cb.equal(cust1.get(customer_.getAttribute("status",
Integer.class)), 1)).select(cust1);
assertEquivalence(q, jpql);
}
@AllowFailure
public void testFetchJoins() {
String jpql = "SELECT d FROM Department LEFT JOIN FETCH d.employees " +
"WHERE d.deptNo = 1";
CriteriaQuery q = cb.create();
Root<Department> d = q.from(Department.class);
d.fetch(department_.getSet("employees", Employee.class), JoinType.LEFT);
q.where(cb.equal(d.get(department_.getAttribute("deptNo",
Integer.class)), 1)).select(d);
assertEquivalence(q, jpql);
}
@AllowFailure
public void testPathNavigation() {
String jpql = "SELECT p.vendor FROM Employee e " +
"JOIN e.contactInfo.phones p WHERE e.contactInfo.address.zipCode ="
+ " '95054'";
CriteriaQuery q = cb.create();
Root<Employee> emp = q.from(Employee.class);
Join<Contact, Phone> phone = emp.join(
employee_.getAttribute("contactInfo", Contact.class)).
join(contact_.getList("phones", Phone.class));
q.where(cb.equal(emp.get(employee_.getAttribute("contactInfo",
Contact.class)).
get(contact_.getAttribute("address", Address.class)).
get(address_.getAttribute("zipCode", String.class)), "95054"));
q.select(phone.get(phone_.getAttribute("vendor", String.class)));
assertEquivalence(q, jpql);
jpql = "SELECT i.name, p FROM Item i JOIN i.photos p WHERE KEY(p) " +
"LIKE '%egret%'";
q = cb.create();
Root<Item> item = q.from(Item.class);
MapJoin<Item, String, Photo> photo = item.join(item_.getMap("photos",
String.class, Photo.class));
q.select(item.get(item_.getAttribute("name", String.class)), photo).
where(cb.like(photo.key(), "%egret%"));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testRestrictQueryResult() {
String jpql = "SELECT t FROM CreditCard c JOIN c.transactionHistory t "
+ "WHERE c.customer.accountNum = 321987 AND INDEX(t) BETWEEN 0 "
+ "AND 9";
CriteriaQuery q = cb.create();
Root<CreditCard> c = q.from(CreditCard.class);
ListJoin<CreditCard, TransactionHistory> t =
c.join(creditCard_.getList("transactionHistory",
TransactionHistory.class));
q.select(t).where(cb.equal(
c.get(creditCard_.getAttribute("customer", Customer.class)).
get(customer_.getAttribute("accountNum", Long.class)), 321987),
cb.between(t.index(), 0, 9));
assertEquivalence(q, jpql);
/*
jpql = "SELECT o FROM Order o WHERE o.lineItems IS EMPTY";
q = cb.create();
Root<Order> order = q.from(Order.class);
Join<Order,LineItem> lineItems = order.join(order_.getList("lineItems",
LineItem.class));
q.where(cb.isEmpty(lineItems));
q.select(order);
assertEquivalence(q, jpql);
*/
}
@AllowFailure
public void testExpressions() {
String jpql = "SELECT o.quantity, o.totalCost*1.08 AS taxedCost, "
+ "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a "
+ "WHERE a.state = 'CA' AND a.county = 'Santa Clara";
CriteriaQuery q = cb.create();
Root<Customer> cust = q.from(Customer.class);
Join<Customer, Order> order = cust.join(customer_.getSet("orders",
Order.class));
Join<Customer, Address> address = cust.join(customer_.getAttribute(
"address", Address.class));
q.where(cb.equal(address.get(address_.getAttribute("state",
String.class)), "CA"),
cb.equal(address.get(address_.getAttribute("county",
String.class)), "Santa Clara"));
q.select(order.get(order_.getAttribute("quantity", Integer.class)),
cb.prod(order.get(order_.getAttribute("totalCost", Double.class)),
1.08),
address.get(address_.getAttribute("zipCode", String.class)));
assertEquivalence(q, jpql);
jpql = "SELECT TYPE(e) FROM Employee e WHERE TYPE(e) <> Exempt";
q = cb.create();
Root<Employee> emp = q.from(Employee.class);
q.select(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
assertEquivalence(q, jpql);
jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w " +
"WHERE c.name = 'Calculus' AND INDEX(w) = 0";
q = cb.create();
Root<Course> course = q.from(Course.class);
ListJoin<Course, Student> w = course.join(course_.getList(
"studentWaitList", Student.class));
q.where(cb.equal(course.get(course_.getAttribute("name",
String.class)), "Calculus"),
cb.equal(w.index(), 0)).select(w.get(student_.getAttribute("name",
String.class)));
assertEquivalence(q, jpql);
jpql = "SELECT SUM(i.price) FROM Order o JOIN o.lineItems i JOIN " +
"o.customer c WHERE c.lastName = 'Smith' AND c.firstName = 'John'";
q = cb.create();
Root<Order> o = q.from(Order.class);
Join<Order, LineItem> i = o.join(order_.getList("lineItems",
LineItem.class));
Join<Order, Customer> c = o.join(order_.getAttribute("customer",
Customer.class));
q.where(cb.equal(c.get(customer_.getAttribute("lastName",
String.class)), "Smith"),
cb.equal(c.get(customer_.getAttribute("firstName",
String.class)), "John"));
q.select(cb.sum(i.get(lineItem_.getAttribute("price",
Double.class))));
assertEquivalence(q, jpql);
/*
jpql = "SELECT SIZE(d.employees) FROM Department d " +
"WHERE d.name = 'Sales'";
q = cb.create();
Root<Department> d = q.from(Department.class);
q.where(cb.equal(d.get(department_.getAttribute("name",
String.class)), "Sales"));
q.select(cb.size(d.get(department_.getSet("employees",
Employee.class))));
assertEquivalence(q, jpql);
*/
jpql = "SELECT e.name, CASE WHEN e.rating = 1 THEN e.salary * 1.1 " +
"WHEN e.rating = 2 THEN e.salary * 1.2 ELSE e.salary * 1.01 END " +
"FROM Employee e WHERE e.department.name = 'Engineering'";
q = cb.create();
Root<Employee> e = q.from(Employee.class);
q.where(cb.equal(e.get(employee_.getAttribute("department",
Department.class)).
get(department_.getAttribute("name", String.class)),
"Engineering"));
q.select(e.get(employee_.getAttribute("name", String.class)),
cb.selectCase()
.when(cb.equal(e.get(employee_.getAttribute("rating",
Integer.class)), 1),
cb.prod(e.get(employee_.getAttribute("salary",
Long.class)), 1.1))
.when(cb.equal(e.get(employee_.getAttribute("rating",
Integer.class)), 2),
cb.prod(e.get(employee_.getAttribute("salary",
Long.class)), 1.2))
.otherwise(cb.prod(e.get(employee_.getAttribute("salary",
Long.class)), 1.01)));
assertEquivalence(q, jpql);
}
/*
@AllowFailure
public void testLiterals() {
String jpql = "SELECT p FROM Person p where 'Joe' MEMBER OF " +
"p.nickNames";
CriteriaQuery q = cb.create();
Root<Person> p = q.from(Person.class);
q.select(p).where(cb.isMember(cb.literal("Joe"), p.get(person_.
getSet("nickNames", String.class))));
assertEquivalence(q, jpql);
}
*/
@AllowFailure
public void testParameters() {
String jpql = "SELECT c FROM Customer c Where c.status = :stat";
CriteriaQuery q = cb.create();
Root<Customer> c = q.from(Customer.class);
Parameter<Integer> param = cb.parameter(Integer.class);
q.select(c).where(cb.equal(c.get(customer_.getAttribute("status",
Integer.class)), param));
assertEquivalence(q, jpql, new String[]{"stat"}, new Object[] {1});
}
@AllowFailure
public void testSelectList() {
String jpql = "SELECT v.location.street, KEY(i).title, VALUE(i) FROM " +
"VideoStore v JOIN v.videoInventory i WHERE v.location.zipCode = " +
"'94301' AND VALUE(i) > 0";
CriteriaQuery q = cb.create();
Root<VideoStore> v = q.from(VideoStore.class);
MapJoin<VideoStore, Movie, Integer> inv = v.join(videoStore_.getMap(
"videoInventory", Movie.class, Integer.class));
q.where(cb.equal(v.get(videoStore_.getAttribute("location",
Address.class)).
get(address_.getAttribute("zipCode", String.class)), "94301"),
cb.gt(inv.value(), 0));
q.select(v.get(videoStore_.getAttribute("location", Address.class)).
get(address_.getAttribute("street", String.class)),
inv.key().get(movie_.getAttribute("title", String.class)),
inv.value());
assertEquivalence(q, jpql);
jpql = "SELECT NEW CustomerDetails(c.id, c.status, o.quantity) FROM " +
"Customer c JOIN c.orders o WHERE o.quantity > 100";
q = cb.create();
Root<Customer> c = q.from(Customer.class);
Join<Customer, Order> o = c.join(customer_.getSet("orders", Order.class));
q.where(cb.gt(o.get(order_.getAttribute("quantity", Integer.class)),
100));
q.select(cb.select(CustomerDetails.class,
c.get(customer_.getAttribute("id", Integer.class)),
c.get(customer_.getAttribute("status", Integer.class)),
o.get(order_.getAttribute("quantity", Integer.class))));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testSubqueries() {
String jpql = "SELECT goodCustomer FROM Customer goodCustomer WHERE " +
"goodCustomer.balanceOwed < (SELECT AVG(c.balanceOwed) FROM " +
"Customer c)";
CriteriaQuery q = cb.create();
Root<Customer> goodCustomer = q.from(Customer.class);
Subquery<Double> sq = q.subquery(Double.class);
Root<Customer> c = sq.from(Customer.class);
q.where(cb.lt(goodCustomer.get(customer_.getAttribute("balanceOwed",
Integer.class)),
sq.select(cb.avg(c.get(customer_.getAttribute("balanceOwed",
Integer.class))))));
q.select(goodCustomer);
assertEquivalence(q, jpql);
jpql = "SELECT DISTINCT emp FROM Employee emp WHERE EXISTS (" +
"SELECT spouseEmp FROM Employee spouseEmp WHERE spouseEmp = " +
"emp.spouse)";
q = cb.create();
Root<Employee> emp = q.from(Employee.class);
Subquery<Employee> sq1 = q.subquery(Employee.class);
Root<Employee> spouseEmp = sq1.from(Employee.class);
sq1.select(spouseEmp);
sq1.where(cb.equal(spouseEmp, emp.get(employee_.getAttribute("spouse",
Employee.class))));
q.where(cb.exists(sq));
q.select(emp).distinct(true);
assertEquivalence(q, jpql);
jpql = "SELECT emp FROM Employee emp WHERE emp.salary > ALL (" +
"SELECT m.salary FROM Manager m WHERE m.department = emp.department)";
q = cb.create();
Root<Employee> emp1 = q.from(Employee.class);
q.select(emp1);
Subquery<BigDecimal> sq2 = q.subquery(BigDecimal.class);
Root<Manager> m = sq2.from(Manager.class);
sq2.select(m.get(manager_.getAttribute("salary", BigDecimal.class)));
sq2.where(cb.equal(m.get(manager_.getAttribute("department",
Department.class)),
emp1.get(employee_.getAttribute("department",
Department.class))));
q.where(cb.gt(emp.get(employee_.getAttribute("salary", Long.class)),
cb.all(sq)));
assertEquivalence(q, jpql);
jpql = "SELECT c FROM Customer c WHERE " +
"(SELECT COUNT(o) FROM c.orders o) > 10";
q = cb.create();
Root<Customer> c1 = q.from(Customer.class);
q.select(c1);
Subquery<Long> sq3 = q.subquery(Long.class);
Root<Customer> c2 = sq3.correlate(c1);
Join<Customer,Order> o = c2.join(customer_.getSet("orders",
Order.class));
q.where(cb.gt(sq3.select(cb.count(o)), 10));
assertEquivalence(q, jpql);
jpql = "SELECT o FROM Order o WHERE 10000 < ALL (" +
"SELECT a.balance FROM o.customer c JOIN c.accounts a)";
q = cb.create();
Root<Order> o1 = q.from(Order.class);
q.select(o1);
Subquery<Integer> sq4 = q.subquery(Integer.class);
Root<Order> o2 = sq4.correlate(o1);
Join<Order,Customer> c3 = o2.join(order_.getAttribute("customer",
Customer.class));
Join<Customer,Account> a = c3.join(customer_.getList("accounts",
Account.class));
sq4.select(a.get(account_.getAttribute("balance", Integer.class)));
q.where(cb.lt(cb.literal(10000), cb.all(sq4)));
assertEquivalence(q, jpql);
jpql = "SELECT o FROM Order o JOIN o.customer c WHERE 10000 < " +
"ALL (SELECT a.balance FROM c.accounts a)";
q = cb.create();
Root<Order> o3 = q.from(Order.class);
q.select(o3);
Join<Order,Customer> c4 = o3.join(Order_.customer);
Subquery<Integer> sq5 = q.subquery(Integer.class);
Join<Order,Customer> c5 = sq5.correlate(c4);
Join<Customer,Account> a2 = c5.join(customer_.getList("accounts",
Account.class));
sq5.select(a.get(account_.getAttribute("balance", Integer.class)));
q.where(cb.lt(cb.literal(10000), cb.all(sq5)));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testGroupByAndHaving() {
String jpql = "SELECT c.status, AVG(c.filledOrderCount), COUNT(c) FROM "
+ "Customer c GROUP BY c.status HAVING c.status IN (1, 2)";
CriteriaQuery q = cb.create();
Root<Customer> c = q.from(Customer.class);
q.groupBy(c.get(customer_.getAttribute("status", Integer.class)));
q.having(cb.in(c.get(customer_.getAttribute("status", Integer.class))).
value(1).value(2));
q.select(c.get(customer_.getAttribute("status", Integer.class)),
cb.avg(c.get(customer_.getAttribute("filledOrderCount",
Integer.class))),
cb.count(c));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testOrdering() {
String jpql = "SELECT o FROM Customer c JOIN c.orders o "
+ "JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity DESC, "
+ "o.totalCost";
CriteriaQuery q = cb.create();
Root<Customer> c = q.from(Customer.class);
Join<Customer,Order> o = c.join(customer_.getSet("orders",
Order.class));
Join<Customer,Address> a = c.join(customer_.getAttribute("address",
Address.class));
q.where(cb.equal(a.get(address_.getAttribute("state", String.class)),
"CA"));
q.orderBy(cb.desc(o.get(order_.getAttribute("quantity",
Integer.class))),
cb.asc(o.get(order_.getAttribute("totalCost", Double.class))));
q.select(o);
assertEquivalence(q, jpql);
jpql = "SELECT o.quantity, a.zipCode FROM Customer c JOIN c.orders " +
"JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity, " +
"a.zipCode";
q = cb.create();
Root<Customer> c1 = q.from(Customer.class);
Join<Customer,Order> o1 = c1.join(customer_.getSet("orders",
Order.class));
Join<Customer,Address> a1 = c1.join(customer_.getAttribute("address",
Address.class));
q.where(cb.equal(a1.get(address_.getAttribute("state", String.class)),
"CA"));
q.orderBy(cb.asc(o1.get(order_.getAttribute("quantity",
Integer.class))),
cb.asc(a1.get(address_.getAttribute("zipCode",
String.class))));
q.select(o1.get(order_.getAttribute("quantity",
Integer.class)),
a1.get(address_.getAttribute("zipCode", String.class)));
assertEquivalence(q, jpql);
jpql = "SELECT o.quantity, o.cost * 1.08 AS taxedCost, a.zipCode " +
"FROM Customer c JOIN c.orders o JOIN c.address a " +
"WHERE a.state = 'CA' AND a.county = 'Santa Clara' " +
"ORDER BY o.quantity, taxedCost, a.zipCode";
q = cb.create();
Root<Customer> c2 = q.from(Customer.class);
Join<Customer,Order> o2 = c2.join(customer_.getSet("orders",
Order.class));
Join<Customer,Address> a2 = c2.join(customer_.getAttribute("address",
Address.class));
q.where(cb.equal(a.get(address_.getAttribute("state", String.class)),
"CA"),
cb.equal(a.get(address_.getAttribute("county", String.class)),
"Santa Clara"));
q.orderBy(cb.asc(o.get(order_.getAttribute("quantity",
Integer.class))),
cb.asc(cb.prod(o.get(order_.getAttribute("totalCost",
Double.class)), 1.08)),
cb.asc(a.get(address_.getAttribute("zipCode", String.class))));
q.select(o.get(order_.getAttribute("quantity", Integer.class)),
cb.prod(o.get(order_.getAttribute("totalCost", Double.class)),
1.08),
a.get(address_.getAttribute("zipCode", String.class)));
assertEquivalence(q, jpql);
}
void assertEquivalence(CriteriaQuery c, String jpql) {
sql.clear();
List cList = em.createQuery(c).getResultList();
assertEquals(1, sql.size());
String cSQL = sql.get(0);
sql.clear();
List jList = em.createQuery(jpql).getResultList();
assertEquals(1, sql.size());
String jSQL = sql.get(0);
assertEquals(jSQL, cSQL);
}
void assertEquivalence(CriteriaQuery c, String jpql, String[] paramNames,
Object[] params) {
sql.clear();
Query q = em.createQuery(c);
for (int i = 0; i < paramNames.length; i++) {
q.setParameter(paramNames[i], params[i]);
}
List cList = q.getResultList();
assertEquals(1, sql.size());
String cSQL = sql.get(0);
sql.clear();
q = em.createQuery(jpql);
for (int i = 0; i < paramNames.length; i++) {
q.setParameter(paramNames[i], params[i]);
}
List jList = q.getResultList();
assertEquals(1, sql.size());
String jSQL = sql.get(0);
assertEquals(jSQL, cSQL);
}
}

View File

@ -1,13 +1,22 @@
package org.apache.openjpa.persistence.criteria;
import java.math.BigDecimal;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.ListJoin;
import javax.persistence.criteria.MapJoin;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.persistence.test.AllowFailure;
import org.apache.openjpa.persistence.test.SQLListenerTestCase;
/**
@ -29,7 +38,32 @@ public class TestTypesafeCriteria extends SQLListenerTestCase {
EntityManager em;
public void setUp() {
super.setUp(Account.class);
super.setUp(DROP_TABLES,
Account.class,
Address.class,
Contact.class,
Contractor.class,
Course.class,
CreditCard.class,
Customer.class,
Department.class,
Employee.class,
Exempt.class,
FrequentFlierPlan.class,
Item.class,
LineItem.class,
Manager.class,
Movie.class,
Person.class,
Order.class,
Phone.class,
Photo.class,
Product.class,
Semester.class,
Student.class,
TransactionHistory.class,
VideoStore.class);
setDictionary();
cb = (CriteriaBuilder)emf.getQueryBuilder();
em = emf.createEntityManager();
@ -154,6 +188,393 @@ public class TestTypesafeCriteria extends SQLListenerTestCase {
// c.from(Account.class).join(Account_.history)
}
@AllowFailure
public void testJoins() {
String jpql = "SELECT c.name FROM Customer c JOIN c.orders o " +
"JOIN o.lineItems i WHERE i.product.productType = 'printer'";
CriteriaQuery c = cb.create();
Root<Customer> cust = c.from(Customer.class);
Join<Customer, Order> order = cust.join(Customer_.orders);
Join<Order, LineItem> item = order.join(Order_.lineItems);
c.select(cust.get(Customer_.name))
.where(cb.equal(item.get(LineItem_.product).
get(Product_.productType), "printer"));
assertEquivalence(c, jpql);
jpql = "SELECT c FROM Customer c LEFT JOIN c.orders o " +
"WHERE c.status = 1";
c = cb.create();
Root<Customer> cust1 = c.from(Customer.class);
Join<Customer, Order> order1 = cust1.join(Customer_.orders,
JoinType.LEFT);
c.where(cb.equal(cust1.get(Customer_.status), 1)).select(cust1);
assertEquivalence(c, jpql);
}
@AllowFailure
public void testFetchJoins() {
String jpql = "SELECT d FROM Department LEFT JOIN FETCH d.employees " +
"WHERE d.deptNo = 1";
CriteriaQuery q = cb.create();
Root<Department> d = q.from(Department.class);
d.fetch(Department_.employees, JoinType.LEFT);
q.where(cb.equal(d.get(Department_.deptNo), 1)).select(d);
assertEquivalence(q, jpql);
}
@AllowFailure
public void testPathNavigation() {
String jpql = "SELECT p.vendor FROM Employee e JOIN " +
"e.contactInfo.phones p " +
"WHERE e.contactInfo.address.zipCode = '95054'";
CriteriaQuery q = cb.create();
Root<Employee> emp = q.from(Employee.class);
Join<Contact, Phone> phone = emp.join(Employee_.contactInfo).
join(Contact_.phones);
q.where(cb.equal(emp.get(Employee_.contactInfo).get(Contact_.address).
get(Address_.zipCode), "95054"));
q.select(phone.get(Phone_.vendor));
assertEquivalence(q, jpql);
jpql = "SELECT i.name, p FROM Item i JOIN i.photos p WHERE KEY(p) " +
"LIKE '%egret%'";
q = cb.create();
Root<Item> item = q.from(Item.class);
MapJoin<Item, String, Photo> photo = item.join(Item_.photos);
q.select(item.get(Item_.name), photo).
where(cb.like(photo.key(), "%egret%"));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testRestrictQueryResult() {
String jpql = "SELECT t FROM CreditCard c JOIN c.transactionHistory t "
+ "WHERE c.customer.accountNum = 321987 AND INDEX(t) BETWEEN 0 "
+ "AND 9";
CriteriaQuery q = cb.create();
Root<CreditCard> c = q.from(CreditCard.class);
ListJoin<CreditCard, TransactionHistory> t =
c.join(CreditCard_.transactionHistory);
q.select(t).where(cb.equal(
c.get(CreditCard_.customer).get(Customer_.accountNum), 321987),
cb.between(t.index(), 0, 9));
assertEquivalence(q, jpql);
jpql = "SELECT o FROM Order o WHERE o.lineItems IS EMPTY";
q = cb.create();
Root<Order> order = q.from(Order.class);
q.where(cb.isEmpty(order.get(Order_.lineItems))).select(order);
assertEquivalence(q, jpql);
}
@AllowFailure
public void testExpressions() {
String jpql = "SELECT o.quantity, o.totalCost*1.08 AS taxedCost, "
+ "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a "
+ "WHERE a.state = 'CA' AND a.county = 'Santa Clara";
CriteriaQuery q = cb.create();
Root<Customer> cust = q.from(Customer.class);
Join<Customer, Order> order = cust.join(Customer_.orders);
Join<Customer, Address> address = cust.join(Customer_.address);
q.where(cb.equal(address.get(Address_.state), "CA"),
cb.equal(address.get(Address_.county), "Santa Clara"));
q.select(order.get(Order_.quantity),
cb.prod(order.get(Order_.totalCost), 1.08),
address.get(Address_.zipCode));
assertEquivalence(q, jpql);
jpql = "SELECT TYPE(e) FROM Employee e WHERE TYPE(e) <> Exempt";
q = cb.create();
Root<Employee> emp = q.from(Employee.class);
q.select(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
assertEquivalence(q, jpql);
jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w " +
"WHERE c.name = 'Calculus' AND INDEX(w) = 0";
q = cb.create();
Root<Course> course = q.from(Course.class);
ListJoin<Course, Student> w = course.join(Course_.studentWaitList);
q.where(cb.equal(course.get(Course_.name), "Calculus"),
cb.equal(w.index(), 0)).select(w.get(Student_.name));
assertEquivalence(q, jpql);
jpql = "SELECT SUM(i.price) FROM Order o JOIN o.lineItems i JOIN " +
"o.customer c WHERE c.lastName = 'Smith' AND c.firstName = 'John'";
q = cb.create();
Root<Order> o = q.from(Order.class);
Join<Order, LineItem> i = o.join(Order_.lineItems);
Join<Order, Customer> c = o.join(Order_.customer);
q.where(cb.equal(c.get(Customer_.lastName), "Smith"),
cb.equal(c.get(Customer_.firstName),"John"));
q.select(cb.sum(i.get(LineItem_.price)));
assertEquivalence(q, jpql);
jpql = "SELECT SIZE(d.employees) FROM Department d " +
"WHERE d.name = 'Sales'";
q = cb.create();
Root<Department> d = q.from(Department.class);
q.where(cb.equal(d.get(Department_.name), "Sales"));
q.select(cb.size(d.get(Department_.employees)));
assertEquivalence(q, jpql);
jpql = "SELECT e.name, CASE WHEN e.rating = 1 THEN e.salary * 1.1 " +
"WHEN e.rating = 2 THEN e.salary * 1.2 ELSE e.salary * 1.01 END " +
"FROM Employee e WHERE e.department.name = 'Engineering'";
q = cb.create();
Root<Employee> e = q.from(Employee.class);
q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
"Engineering"));
q.select(e.get(Employee_.name),
cb.selectCase()
.when(cb.equal(e.get(Employee_.rating), 1),
cb.prod(e.get(Employee_.salary), 1.1))
.when(cb.equal(e.get(Employee_.rating), 2),
cb.prod(e.get(Employee_.salary), 1.2))
.otherwise(cb.prod(e.get(Employee_.salary), 1.01)));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testLiterals() {
String jpql = "SELECT p FROM Person p where 'Joe' MEMBER OF p.nickNames";
CriteriaQuery q = cb.create();
Root<Person> p = q.from(Person.class);
q.select(p).where(cb.isMember(cb.literal("Joe"), p.get(
Person_.nickNames)));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testParameters() {
String jpql = "SELECT c FROM Customer c Where c.status = :stat";
CriteriaQuery q = cb.create();
Root<Customer> c = q.from(Customer.class);
Parameter<Integer> param = cb.parameter(Integer.class);
q.select(c).where(cb.equal(c.get(Customer_.status), param));
assertEquivalence(q, jpql, new String[]{"stat"}, new Object[] {1});
}
@AllowFailure
public void testSelectList() {
String jpql = "SELECT v.location.street, KEY(i).title, VALUE(i) FROM " +
"VideoStore v JOIN v.videoInventory i WHERE v.location.zipCode = " +
"'94301' AND VALUE(i) > 0";
CriteriaQuery q = cb.create();
Root<VideoStore> v = q.from(VideoStore.class);
MapJoin<VideoStore, Movie, Integer> inv = v.join(
VideoStore_.videoInventory);
q.where(cb.equal(v.get(VideoStore_.location).get(Address_.zipCode),
"94301"),
cb.gt(inv.value(), 0));
q.select(v.get(VideoStore_.location).get(Address_.street),
inv.key().get(Movie_.title), inv.value());
assertEquivalence(q, jpql);
jpql = "SELECT NEW CustomerDetails(c.id, c.status, o.quantity) FROM " +
"Customer c JOIN c.orders o WHERE o.quantity > 100";
q = cb.create();
Root<Customer> c = q.from(Customer.class);
Join<Customer, Order> o = c.join(Customer_.orders);
q.where(cb.gt(o.get(Order_.quantity), 100));
q.select(cb.select(CustomerDetails.class,
c.get(Customer_.id),
c.get(Customer_.status),
o.get(Order_.quantity)));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testSubqueries() {
String jpql = "SELECT goodCustomer FROM Customer goodCustomer WHERE " +
"goodCustomer.balanceOwed < (SELECT AVG(c.balanceOwed) FROM " +
"Customer c)";
CriteriaQuery q = cb.create();
Root<Customer> goodCustomer = q.from(Customer.class);
Subquery<Double> sq = q.subquery(Double.class);
Root<Customer> c = sq.from(Customer.class);
q.where(cb.lt(goodCustomer.get(Customer_.balanceOwed),
sq.select(cb.avg(c.get(Customer_.balanceOwed)))));
q.select(goodCustomer);
assertEquivalence(q, jpql);
jpql = "SELECT DISTINCT emp FROM Employee emp WHERE EXISTS (" +
"SELECT spouseEmp FROM Employee spouseEmp WHERE spouseEmp = " +
"emp.spouse)";
q = cb.create();
Root<Employee> emp = q.from(Employee.class);
Subquery<Employee> sq1 = q.subquery(Employee.class);
Root<Employee> spouseEmp = sq1.from(Employee.class);
sq1.select(spouseEmp);
sq1.where(cb.equal(spouseEmp, emp.get(Employee_.spouse)));
q.where(cb.exists(sq));
q.select(emp).distinct(true);
assertEquivalence(q, jpql);
jpql = "SELECT emp FROM Employee emp WHERE emp.salary > ALL (" +
"SELECT m.salary FROM Manager m WHERE m.department = " +
"emp.department)";
q = cb.create();
Root<Employee> emp1 = q.from(Employee.class);
q.select(emp1);
Subquery<BigDecimal> sq2 = q.subquery(BigDecimal.class);
Root<Manager> m = sq2.from(Manager.class);
sq2.select(m.get(Manager_.salary));
sq2.where(cb.equal(m.get(Manager_.department), emp1.get(
Employee_.department)));
q.where(cb.gt(emp.get(Employee_.salary), cb.all(sq)));
assertEquivalence(q, jpql);
jpql = "SELECT c FROM Customer c WHERE " +
"(SELECT COUNT(o) FROM c.orders o) > 10";
q = cb.create();
Root<Customer> c1 = q.from(Customer.class);
q.select(c1);
Subquery<Long> sq3 = q.subquery(Long.class);
Root<Customer> c2 = sq3.correlate(c1);
Join<Customer,Order> o = c2.join(Customer_.orders);
q.where(cb.gt(sq3.select(cb.count(o)), 10));
assertEquivalence(q, jpql);
jpql = "SELECT o FROM Order o WHERE 10000 < ALL (" +
"SELECT a.balance FROM o.customer c JOIN c.accounts a)";
q = cb.create();
Root<Order> o1 = q.from(Order.class);
q.select(o1);
Subquery<Integer> sq4 = q.subquery(Integer.class);
Root<Order> o2 = sq4.correlate(o1);
Join<Order,Customer> c3 = o2.join(Order_.customer);
Join<Customer,Account> a = c3.join(Customer_.accounts);
sq4.select(a.get(Account_.balance));
q.where(cb.lt(cb.literal(10000), cb.all(sq4)));
assertEquivalence(q, jpql);
jpql = "SELECT o FROM Order o JOIN o.customer c WHERE 10000 < " +
"ALL (SELECT a.balance FROM c.accounts a)";
q = cb.create();
Root<Order> o3 = q.from(Order.class);
q.select(o3);
Join<Order,Customer> c4 = o3.join(Order_.customer);
Subquery<Integer> sq5 = q.subquery(Integer.class);
Join<Order,Customer> c5 = sq5.correlate(c4);
Join<Customer,Account> a2 = c5.join(Customer_.accounts);
sq5.select(a.get(Account_.balance));
q.where(cb.lt(cb.literal(10000), cb.all(sq5)));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testGroupByAndHaving() {
String jpql = "SELECT c.status, AVG(c.filledOrderCount), COUNT(c) FROM "
+ "Customer c GROUP BY c.status HAVING c.status IN (1, 2)";
CriteriaQuery q = cb.create();
Root<Customer> c = q.from(Customer.class);
q.groupBy(c.get(Customer_.status));
q.having(cb.in(c.get(Customer_.status)).value(1).value(2));
q.select(c.get(Customer_.status),
cb.avg(c.get(Customer_.filledOrderCount)),
cb.count(c));
assertEquivalence(q, jpql);
}
@AllowFailure
public void testOrdering() {
String jpql = "SELECT o FROM Customer c JOIN c.orders o " +
"JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity DESC, " +
"o.totalCost";
CriteriaQuery q = cb.create();
Root<Customer> c = q.from(Customer.class);
Join<Customer,Order> o = c.join(Customer_.orders);
Join<Customer,Address> a = c.join(Customer_.address);
q.where(cb.equal(a.get(Address_.state), "CA"));
q.orderBy(cb.desc(o.get(Order_.quantity)),
cb.asc(o.get(Order_.totalCost)));
q.select(o);
assertEquivalence(q, jpql);
jpql = "SELECT o.quantity, a.zipCode FROM Customer c JOIN c.orders " +
"JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity, " +
"a.zipCode";
q = cb.create();
Root<Customer> c1 = q.from(Customer.class);
Join<Customer,Order> o1 = c1.join(Customer_.orders);
Join<Customer,Address> a1 = c1.join(Customer_.address);
q.where(cb.equal(a1.get(Address_.state), "CA"));
q.orderBy(cb.asc(o1.get(Order_.quantity)), cb.asc(a1.get(
Address_.zipCode)));
q.select(o1.get(Order_.quantity), a1.get(Address_.zipCode));
assertEquivalence(q, jpql);
jpql = "SELECT o.quantity, o.cost * 1.08 AS taxedCost, a.zipCode " +
"FROM Customer c JOIN c.orders o JOIN c.address a " +
"WHERE a.state = 'CA' AND a.county = 'Santa Clara' " +
"ORDER BY o.quantity, taxedCost, a.zipCode";
q = cb.create();
Root<Customer> c2 = q.from(Customer.class);
Join<Customer,Order> o2 = c2.join(Customer_.orders);
Join<Customer,Address> a2 = c2.join(Customer_.address);
q.where(cb.equal(a.get(Address_.state), "CA"),
cb.equal(a.get(Address_.county), "Santa Clara"));
q.orderBy(cb.asc(o.get(Order_.quantity)),
cb.asc(cb.prod(o.get(Order_.totalCost), 1.08)),
cb.asc(a.get(Address_.zipCode)));
q.select(o.get(Order_.quantity),
cb.prod(o.get(Order_.totalCost), 1.08),
a.get(Address_.zipCode));
assertEquivalence(q, jpql);
}
@AllowFailure
void assertEquivalence(CriteriaQuery c, String jpql,
String[] paramNames, Object[] params) {
sql.clear();
Query q = em.createQuery(c);
for (int i = 0; i < paramNames.length; i++) {
q.setParameter(paramNames[i], params[i]);
}
List cList = q.getResultList();
assertEquals(1, sql.size());
String cSQL = sql.get(0);
sql.clear();
q = em.createQuery(jpql);
for (int i = 0; i < paramNames.length; i++) {
q.setParameter(paramNames[i], params[i]);
}
List jList = q.getResultList();
assertEquals(1, sql.size());
String jSQL = sql.get(0);
assertEquals(jSQL, cSQL);
}
void assertEquivalence(CriteriaQuery c, String jpql) {
sql.clear();

View File

@ -0,0 +1,61 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.persistence.criteria;
import java.sql.Timestamp;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="CR_TRS")
public class TransactionHistory {
@Id
@GeneratedValue
private int id;
private Timestamp transDate;
private String details;
public int getId() {
return id;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public Timestamp getTimestamp() {
return transDate;
}
public void setTimestamp(Timestamp transDate) {
this.transDate = transDate;
}
}

View File

@ -0,0 +1,16 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import java.sql.Timestamp;
import javax.persistence.metamodel.Attribute;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.TransactionHistory.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class TransactionHistory_ {
public static volatile Attribute<TransactionHistory,String> details;
public static volatile Attribute<TransactionHistory,Integer> id;
public static volatile Attribute<TransactionHistory,Timestamp> transDate;
}

View File

@ -18,9 +18,18 @@
*/
package org.apache.openjpa.persistence.criteria;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MapKeyJoinColumn;
import javax.persistence.Table;
/**
@ -29,9 +38,54 @@ import javax.persistence.Table;
*
*/
@Entity
@Table(name="CR_VIDEOSTORE")
@Table(name="CR_VSTR")
public class VideoStore {
@Id
@GeneratedValue
private int id;
private String name;
@Embedded
private Address location;
@ElementCollection
@CollectionTable(name="INVENTORY",
joinColumns=@JoinColumn(name="STORE"))
@Column(name="COPIES_IN_STOCK")
@MapKeyJoinColumn(name="MOVIE", referencedColumnName="ID")
private Map<Movie, Integer> videoInventory = new HashMap<Movie, Integer>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map getVideoInventory() {
return videoInventory;
}
public void addToVideoInventory(Movie movie, Integer inventory) {
videoInventory.put(movie, inventory);
}
public Address getLocation() {
return location;
}
public void setLocation(Address location) {
this.location = location;
}
}

View File

@ -0,0 +1,17 @@
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
package org.apache.openjpa.persistence.criteria;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Map;
@javax.persistence.metamodel.TypesafeMetamodel(value=org.apache.openjpa.persistence.criteria.VideoStore.class)
@javax.annotation.Generated(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Sat May 09 23:22:02 PDT 2009")
public class VideoStore_ {
public static volatile Attribute<VideoStore,Integer> id;
public static volatile Attribute<VideoStore,Address> location;
public static volatile Attribute<VideoStore,String> name;
public static volatile Map<VideoStore,Movie,Integer> videoInventory;
}