Java Tutorial/JPA/ResultSet Mapping
Содержание
Alias Column In Resultset Mapping
File: Employee.java
<source lang="java">
import java.util.ArrayList; import java.util.Collection; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityResult; import javax.persistence.FieldResult; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.SqlResultSetMapping; import javax.persistence.SqlResultSetMappings; import javax.persistence.Table; @Entity @Table(name="EMP") @SqlResultSetMappings({
@SqlResultSetMapping( name="EmployeeWithAddressColumnAlias", entities={@EntityResult(entityClass=Employee.class, fields=@FieldResult(name="id", column="EMP_ID")), @EntityResult(entityClass=Address.class)} )
}) public class Employee {
@Id @Column(name="EMP_ID") private int id; private String name; @OneToOne private Address address; @ManyToOne @JoinColumn(name="DEPT_ID") private Department department; @ManyToOne @JoinColumn(name="MANAGER_ID") private Employee manager; @OneToMany(mappedBy="manager") private Collection<Employee> directs = new ArrayList<Employee>(); 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 Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } public Collection<Employee> getDirects() { return directs; } public void addDirect(Employee employee) { if (!getDirects().contains(employee)) { getDirects().add(employee); if (employee.getManager() != null) { employee.getManager().getDirects().remove(employee); } employee.setManager(this); } } public Employee getManager() { return manager; } public void setManager(Employee manager) { this.manager = manager; }
}
@Entity class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String deptName) { this.name = deptName; } public String toString() { return "Department id: " + getId() + ", name: " + getName(); }
} @Entity class Address {
@Id private int id; private String street; private String city; private String state; private String zip; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStreet() { return street; } public void setStreet(String address) { this.street = address; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public String toString() { return "Address id: " + getId() + ", street: " + getStreet() + ", city: " + getCity() + ", state: " + getState() + ", zip: " + getZip(); }
}</source>
ID Class ResultSet Mapping
File: Employee.java
<source lang="java">
import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityResult; import javax.persistence.FieldResult; import javax.persistence.Id; import javax.persistence.IdClass; import javax.persistence.JoinColumn; import javax.persistence.JoinColumns; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.SqlResultSetMapping; import javax.persistence.Table; @Entity @Table(name="EMP") @IdClass(EmployeeId.class) @SqlResultSetMapping(
name="EmployeeAndManager", entities={ @EntityResult(entityClass=Employee.class), @EntityResult( entityClass=Employee.class, fields={ @FieldResult(name="country", column="MGR_COUNTRY"), @FieldResult(name="id", column="MGR_ID"), @FieldResult(name="name", column="MGR_NAME"), @FieldResult(name="manager.country", column="MGR_MGR_COUNTRY"), @FieldResult(name="manager.id", column="MGR_MGR_ID") } ) }
) public class Employee {
@Id private String country; @Id private int id; private String name; @ManyToOne @JoinColumns({ @JoinColumn(name="MANAGER_COUNTRY", referencedColumnName="COUNTRY"), @JoinColumn(name="MANAGER_ID", referencedColumnName="ID") }) private Employee manager; @OneToMany(mappedBy="manager") private Collection<Employee> directs = new ArrayList<Employee>(); public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Collection<Employee> getDirects() { return directs; } public Employee getManager() { return manager; } public void setManager(Employee manager) { this.manager = manager; }
} class EmployeeId implements Serializable {
private String country; private int id; public EmployeeId() {} public EmployeeId(String country, int id) { this.country = country; this.id = id; } public String getCountry() { return country; } public int getId() { return id; } public boolean equals(Object o) { return ((o instanceof EmployeeId) && country.equals(((EmployeeId)o).getCountry()) && id == ((EmployeeId) o).getId()); } public int hashCode() { return country.hashCode() + id; }
}</source>
Resultset Mapping With Two Entities
File: Employee.java
<source lang="java">
import java.util.ArrayList; import java.util.Collection; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityResult; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.SqlResultSetMapping; import javax.persistence.SqlResultSetMappings; import javax.persistence.Table; @Entity @Table(name="EMP") @SqlResultSetMappings({
@SqlResultSetMapping( name="EmployeeWithAddress", entities={@EntityResult(entityClass=Employee.class), @EntityResult(entityClass=Address.class)} )
}) public class Employee {
@Id @Column(name="EMP_ID") private int id; private String name; @OneToOne private Address address; @ManyToOne @JoinColumn(name="DEPT_ID") private Department department; @ManyToOne @JoinColumn(name="MANAGER_ID") private Employee manager; @OneToMany(mappedBy="manager") private Collection<Employee> directs = new ArrayList<Employee>(); 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 Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } public Collection<Employee> getDirects() { return directs; } public void addDirect(Employee employee) { if (!getDirects().contains(employee)) { getDirects().add(employee); if (employee.getManager() != null) { employee.getManager().getDirects().remove(employee); } employee.setManager(this); } } public Employee getManager() { return manager; } public void setManager(Employee manager) { this.manager = manager; }
}
@Entity class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String deptName) { this.name = deptName; } public String toString() { return "Department id: " + getId() + ", name: " + getName(); }
} @Entity class Address {
@Id private int id; private String street; private String city; private String state; private String zip; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStreet() { return street; } public void setStreet(String address) { this.street = address; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public String toString() { return "Address id: " + getId() + ", street: " + getStreet() + ", city: " + getCity() + ", state: " + getState() + ", zip: " + getZip(); }
}</source>
Single Table ResultSet Mapping
File: Employee.java
<source lang="java">
import java.util.ArrayList; import java.util.Collection; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityResult; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.SqlResultSetMapping; import javax.persistence.SqlResultSetMappings; import javax.persistence.Table; @Entity @Table(name="EMP") @SqlResultSetMappings({
@SqlResultSetMapping( name="employeeResult", entities=@EntityResult(entityClass=Employee.class))
}) public class Employee {
@Id @Column(name="EMP_ID") private int id; private String name; @OneToOne private Address address; @ManyToOne @JoinColumn(name="DEPT_ID") private Department department; @ManyToOne @JoinColumn(name="MANAGER_ID") private Employee manager; @OneToMany(mappedBy="manager") private Collection<Employee> directs = new ArrayList<Employee>(); 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 Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } public Collection<Employee> getDirects() { return directs; } public void addDirect(Employee employee) { if (!getDirects().contains(employee)) { getDirects().add(employee); if (employee.getManager() != null) { employee.getManager().getDirects().remove(employee); } employee.setManager(this); } } public Employee getManager() { return manager; } public void setManager(Employee manager) { this.manager = manager; }
}
@Entity class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String deptName) { this.name = deptName; } public String toString() { return "Department id: " + getId() + ", name: " + getName(); }
} @Entity class Address {
@Id private int id; private String street; private String city; private String state; private String zip; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStreet() { return street; } public void setStreet(String address) { this.street = address; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public String toString() { return "Address id: " + getId() + ", street: " + getStreet() + ", city: " + getCity() + ", state: " + getState() + ", zip: " + getZip(); }
}</source>
Sql ResultSet Mapping For Hierarchical Entity
File: Employee.java
<source lang="java">
import java.util.Date; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.EntityResult; import javax.persistence.FieldResult; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.SqlResultSetMapping; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity @Table(name="EMPLOYEE_STAGE") @Inheritance @DiscriminatorColumn(name="EMP_TYPE") @SqlResultSetMapping(
name="EmployeeStageMapping", entities= @EntityResult( entityClass=Employee.class, discriminatorColumn="TYPE", fields={ @FieldResult(name="startDate", column="START_DATE"), @FieldResult(name="dailyRate", column="DAILY_RATE"), @FieldResult(name="hourlyRate", column="HOURLY_RATE") } )
) public abstract class Employee {
@Id private int id; private String name; @Temporal(TemporalType.DATE) @Column(name="START_DATE") private Date startDate; 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 Date getStartDate() { return startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } public String toString() { return "Employee id: " + getId() + " name: " + getName(); }
} @Entity class ContractEmployee extends Employee {
@Column(name="DAILY_RATE") private int dailyRate; private int term; public int getDailyRate() { return dailyRate; } public void setDailyRate(int dailyRate) { this.dailyRate = dailyRate; } public int getTerm() { return term; } public void setTerm(int term) { this.term = term; } public String toString() { return "ContractEmployee id: " + getId() + " name: " + getName(); }
}
@Entity(name="PTEmp") @DiscriminatorValue("PTEmp") class PartTimeEmployee extends Employee {
@Column(name="HOURLY_RATE") private float hourlyRate; public float getHourlyRate() { return hourlyRate; } public void setHourlyRate(float hourlyRate) { this.hourlyRate = hourlyRate; } public String toString() { return "PartTimeEmployee id: " + getId() + " name: " + getName(); }
}</source>
Sql ResultSet Mapping With Entity And Column
File: Employee.java
<source lang="java">
import java.util.ArrayList; import java.util.Collection; import javax.persistence.Column; import javax.persistence.ColumnResult; import javax.persistence.Entity; import javax.persistence.EntityResult; import javax.persistence.FieldResult; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.SqlResultSetMapping; import javax.persistence.SqlResultSetMappings; import javax.persistence.Table; @Entity @Table(name="EMP") @SqlResultSetMappings({
@SqlResultSetMapping( name="DepartmentSummary", entities={@EntityResult(entityClass=Department.class, fields=@FieldResult(name="name", column="DEPT_NAME")), @EntityResult(entityClass=Employee.class)}, columns={@ColumnResult(name="TOT_EMP"), @ColumnResult(name="AVG_SAL")} )
}) public class Employee {
@Id @Column(name="EMP_ID") private int id; private String name; @OneToOne private Address address; @ManyToOne @JoinColumn(name="DEPT_ID") private Department department; @ManyToOne @JoinColumn(name="MANAGER_ID") private Employee manager; @OneToMany(mappedBy="manager") private Collection<Employee> directs = new ArrayList<Employee>(); 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 Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } public Collection<Employee> getDirects() { return directs; } public void addDirect(Employee employee) { if (!getDirects().contains(employee)) { getDirects().add(employee); if (employee.getManager() != null) { employee.getManager().getDirects().remove(employee); } employee.setManager(this); } } public Employee getManager() { return manager; } public void setManager(Employee manager) { this.manager = manager; }
}
@Entity class Department {
@Id private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String deptName) { this.name = deptName; } public String toString() { return "Department id: " + getId() + ", name: " + getName(); }
} @Entity class Address {
@Id private int id; private String street; private String city; private String state; private String zip; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStreet() { return street; } public void setStreet(String address) { this.street = address; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getZip() { return zip; } public void setZip(String zip) { this.zip = zip; } public String toString() { return "Address id: " + getId() + ", street: " + getStreet() + ", city: " + getCity() + ", state: " + getState() + ", zip: " + getZip(); }
}</source>
Sql ResultSet Mapping With Entity Result And Field Result
File: Employee.java
<source lang="java">
import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityResult; import javax.persistence.FieldResult; import javax.persistence.Id; import javax.persistence.IdClass; import javax.persistence.JoinColumn; import javax.persistence.JoinColumns; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.SqlResultSetMapping; import javax.persistence.Table; @Entity @Table(name="EMP") @IdClass(EmployeeId.class) @SqlResultSetMapping(
name="EmployeeAndManager", entities={ @EntityResult(entityClass=Employee.class), @EntityResult( entityClass=Employee.class, fields={ @FieldResult(name="country", column="MGR_COUNTRY"), @FieldResult(name="id", column="MGR_ID"), @FieldResult(name="name", column="MGR_NAME"), @FieldResult(name="manager.country", column="MGR_MGR_COUNTRY"), @FieldResult(name="manager.id", column="MGR_MGR_ID") } ) }
) public class Employee {
@Id private String country; @Id private int id; private String name; @ManyToOne @JoinColumns({ @JoinColumn(name="MANAGER_COUNTRY", referencedColumnName="COUNTRY"), @JoinColumn(name="MANAGER_ID", referencedColumnName="ID") }) private Employee manager; @OneToMany(mappedBy="manager") private Collection<Employee> directs = new ArrayList<Employee>(); public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Collection<Employee> getDirects() { return directs; } public Employee getManager() { return manager; } public void setManager(Employee manager) { this.manager = manager; }
} class EmployeeId implements Serializable {
private String country; private int id; public EmployeeId() {} public EmployeeId(String country, int id) { this.country = country; this.id = id; } public String getCountry() { return country; } public int getId() { return id; } public boolean equals(Object o) { return ((o instanceof EmployeeId) && country.equals(((EmployeeId)o).getCountry()) && id == ((EmployeeId) o).getId()); } public int hashCode() { return country.hashCode() + id; }
}</source>