Java Tutorial/JPA/ResultSet Mapping

Материал из Java эксперт
Перейти к: навигация, поиск

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>