当前位置: 首页 > 知识库问答 >
问题:

JPA查询和关系

屠坚壁
2023-03-14

我正在开发一个人力资源管理应用程序,所以我对如何通过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;

            ...
        }
SELECT * FROM employees
INNER JOIN departments_languages using(department_id)
WHERE employeed_id = 1 and language_id = 1

从这个查询中,我需要员工信息,以及部门名称(假设languageId为1)

从eclipse JPA控制台执行查询将返回一个Employee对象,该对象具有所有关系,但结果都是相关的

你能给我看一个这种设计的样本查询吗

共有1个答案

那昊
2023-03-14

解决了使用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风格来提高性能;)

 类似资料:
  • 当使用jpa本机查询 事务传播是我们正在使用的正确jpa的唯一特性吗? 在我的意见中,我就像使用普通的旧jdbc pluc jpa事务传播 我正在阅读PRO JPA一书,根据我的理解 当我们使用JPA本机查询获取一组标量值时(与我们使用jdbc的方式很相似),实际上没有托管实体和持久性上下文的概念。当我们通过本机查询检索实体时,情况会发生变化。

  • 我对Spring和冬眠是新的。我有一个使用Spring、Hibernate和PostgreSQL的项目。我知道我可以使用Spring Data JPA或Hibernate查询数据库,但我不知道每种方法的优点和缺点是什么。我还知道在后台,Spring Data JPA会调用Hibernate。那么我应该使用什么最佳方式来查询数据库以获得最佳性能,Spring数据JPA或Hibernate或取决于具体

  • 我是JPA新手,现在学习如何通过关系连接两个表。我得到的实体来自数据库。我有两张桌子,分别是Department和Employee。许多员工属于一个部门。 部门 雇员 多对一 错误

  • 我正在使用Spring Data JPA(使用Hibernate作为我的JPA提供程序),并希望定义一个方法,附带一个HQL查询: HQL查询的外观如何才能使其正常工作?我知道,如果,我可以简单地返回一个长值,然后在我的Java代码中检查,但是这种变通方法不应该是必要的,对吗?

  • 我使用的是spring boot版本2.0.3.Release和spring data jpa版本2.0.8.Release。我有两个表TableA、TableB,它们是一对一映射的。

  • 我有两个类具有单向的单人关系: 当我救了这些类,一切都很好。现在,我想基于现有的a检索另一个。我创建了一个CriteriaQuery,它基本上是“Select*FROM OTHERE WHERE a=:a”。但是当我将A类型的对象设置到查询中时,它将失败。查看数据库,我可以看到另一个.a字段实际上是一个varchar,其值为“typeA:123”(其中123是a对象的ID)。不幸的是,我不能在这里