我正在开发一个 HRM 应用程序,因此我对如何通过 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;
...
}
部门语言实体
@Entity
@Table(name="departments_languages")
@NamedQuery(name="DepartmentsLanguage.findAll", query="SELECT d FROM DepartmentsLanguage d")
public class DepartmentsLanguage implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private DepartmentsLanguagePK id;
@Column(length=255)
private String description;
@Column(length=255)
private String name;
//bi-directional many-to-one association to Department
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="department_id", nullable=false, insertable=false, updatable=false)
private Department department;
//bi-directional many-to-one association to Language
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="language_id", nullable=false, insertable=false, updatable=false)
private Language language;
...
}
首先,我问您这是否是正确的方法以及如何执行 JPA 查询:
SELECT * FROM employees
INNER JOIN departments_languages using(department_id)
WHERE employeed_id = 1 and language_id = 1
从此查询中,我需要员工信息和部门名称(假设 languageId 为 1 )
从 eclipse JPA 控制台执行查询会返回一个具有所有关系的 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");
您还可以使用 EntiyGraph 功能以出色的 JPA 风格提高性能;)
关于java - JPA 查询和关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40494632/