java - JPA 查询和关系

标签 java hibernate jpa

我正在开发一个 HRM 应用程序,因此我对如何通过 JPA 管理实体感到困惑。

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

enter image description here

按照我的数据库表:

员工实体类:

  @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/

相关文章:

java - 可以使用 Hibernate 来存储没有类来表示其结构的数据的 HashMap 吗?

java - JPA entityManager.merge 将 LocalDateTime 转换为 SQLServer 2012 DATETIME2

java - Jersey 2 使类/对象在整个应用程序中持续存在

java - 服务器长时间保持连接时http请求会超时吗?

java - Android 上网抛出 IOException

java - servlet 不将 session 属性转发给 jsp

java - 没有关系实体的 JPA 存储库选择

java - Hibernate:org.hibernate.criterion.ProjectionList 无法转换为 org.hibernate.Criteria

java - 无法使用 ehcache 配置 JPA

java - 是否可以在 Hibernate/JPA 中动态定义列名?