Java JPA查询与关系

Java JPA查询与关系,java,hibernate,jpa,Java,Hibernate,Jpa,我正在开发一个人力资源管理应用程序,所以我对如何通过JPA管理实体感到困惑 我的案例是在多语言上下文中的一组表中恢复的: -雇员 -部门 -语言 -语言系 以下是我的数据库表: 员工实体类别: @Entity @Table(name="employees") @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e") public class Employee implements Seriali

我正在开发一个人力资源管理应用程序,所以我对如何通过JPA管理实体感到困惑

我的案例是在多语言上下文中的一组表中恢复的: -雇员 -部门 -语言 -语言系

以下是我的数据库表:

员工实体类别:

  @Entity
  @Table(name="employees")
  @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e")
  public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="employeed_id", unique=true, nullable=false)
    private int employeedId;

    @Column(nullable=false, length=255)
    private String address;

    @Temporal(TemporalType.DATE)
    @Column(nullable=false)
    private Date birthday;

    ...

    //bi-directional many-to-one association to Department
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="department_id", nullable=false)
    private Department department
  }
部门实体类

@Entity
@Table(name="departments")
@NamedQuery(name="Department.findAll", query="SELECT d FROM Department d")
public class Department implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="department_id", unique=true, nullable=false)
    private int departmentId;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="date_added", nullable=false)
    private Date dateAdded;

    @Column(name="location_id", nullable=false)
    private int locationId;

    @Column(nullable=false)
    private byte status;

    //bi-directional many-to-one association to DepartmentsLanguage
    @OneToMany(mappedBy="department")
    private Set<DepartmentsLanguage> departmentsLanguages;

    //bi-directional many-to-one association to Employee
    @OneToMany(mappedBy="department",fetch=FetchType.LAZY)
    private Set<Employee> employees;

    ...
}
首先,我想问您,这是否是一种正确的方法,以及如何执行JPA查询,如下所示:

SELECT * FROM employees
INNER JOIN departments_languages using(department_id)
WHERE employeed_id = 1 and language_id = 1
从这个查询中,我需要员工信息和部门名称(假设languageId为1)

从EclipseJPA控制台执行查询将返回一个包含所有关系的Employee对象,但同时返回所有相关结果


您能给我看一个这种设计的示例查询吗?请使用fetch join实现查询,例如:

Query query = entityManager.createQuery("select e from Employee as e "
    + "JOIN FETCH e.department d "
    + "JOIN FETCH d.departmentsLanguages dl "
    + "where e.employeedId = :employeeId "
    + "and dl.language = :languageId");

此外,您还可以使用EntityGraph功能来提高JPA风格的性能;)

解决了使用fetch join实现查询的问题,例如:

Query query = entityManager.createQuery("select e from Employee as e "
    + "JOIN FETCH e.department d "
    + "JOIN FETCH d.departmentsLanguages dl "
    + "where e.employeedId = :employeeId "
    + "and dl.language = :languageId");
此外,您还可以使用EntityGraph功能来提高JPA风格的性能;)