簡體   English   中英

JPA查詢和關系

[英]JPA Query and Relations

我正在開發一個HRM應用程序,所以我對如何通過JPA管理實體感到困惑。

我恢復的情況是多語言環境中的一組表:-employees -departments -languages -departments_languages

在此輸入圖像描述

跟隨我的數據庫表:

員工實體類:

  @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對象,但都返回所有相關結果

你能告訴我這種設計的樣本查詢嗎?

解決了使用獲取連接實現查詢,例如:

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風格的性能;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM