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

如何在带有注释的Hibernate和Spring中处理连接查询?

衡丰茂
2023-03-14

我正在使用Spring和Hibernate与MySQL开发应用程序。我是Hibernate的新手,完成了基本任务...

现在,我需要在选择查询中应用连接,以使用注释从多个表中获取数据。我已经找过了,但还是不知道。。。

这里是我的数据库表和bean类:

Table 1: 'employee_info' ( id, empid, empname, doj and jobtitle )

Table 2: 'employee_login' ( username, password, status and empid )

我的bean类是:

员工信息orm.java

@Entity()
@Table(name = "employee_info")
public class EmployeeInfoForm {

@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = true)
private int id;

@Column(name = "empId")
private int empId;

@Column(name = "empname")
private String empName;

@Column(name = "doj")
private Date empDoj;

@Column(name = "jobtitle")
private String empJobTitle;

public int getEmpId() {
    return empId;
}

public void setEmpId(int empId) {
    this.empId = empId;
}

public void setEmpDoj(Date empDoj) {
    this.empDoj = empDoj;
}

public String getEmpName() {
    return empName;
}

public void setEmpName(String empName) {
    this.empName = empName;
}

public Date getEmpDoj() {
    return empDoj;
}

public void setEmp_Doj(Date empDoj) {
    this.empDoj = empDoj;
}

public String getEmpJobTitle() {
    return empJobTitle;
}

public void setEmpJobTitle(String empJobTitle) {
    this.empJobTitle = empJobTitle;
}


}

员工登录orm.java

@Entity()
@Table(name = "employee_login")
public class EmployeeLoginForm {

@Id
@Column(name = "username")
private String empUserName;

@Column(name = "password")
private String empPassword;

@Column(name = "status")
private String empStatus;

@Column(name = "empid")
private int empId;

public String getEmpUserName() {
    return empUserName;
}

public int getEmpId() {
    return empId;
}

public void setEmpId(int empId) {
    this.empId = empId;
}

public void setEmpUserName(String empUserName) {
    this.empUserName = empUserName;
}

public String getEmpPassword() {
    return empPassword;
}

public void setEmpPassword(String empPassword) {
    this.empPassword = empPassword;
}

public String getEmpStatus() {
    return empStatus;
}

public void setEmpStatus(String empStatus) {
    this.empStatus = empStatus;
}

}

要求:

当empid在两个表上匹配时,我想从employee\u info和employee\u login表中选择字段empid、empname、jobtitle和字段status。。。

请帮助我完成我的工作...

感谢您的建议和指导。。。

共有3个答案

陶智
2023-03-14

可以使用Hibernate标准投影执行以下操作:

public List extractEmployeeAttributes() {
    log.debug("extractEmployeeAttributes");
    try {
                    Session session = sessionFactory.getCurrentSession();
                    session.beginTransaction();
           Criteria c1 = session.createCriteria(employee_info.class,emp_info);
           Criteria c2 = session.createCriteria(employee_login.class,emp_log);
           c1.setProjection(Projections.projectionList()
                                .add(Projections.property("empid"))
                                .add(Projections.property("empname"))
                                .add(Projections.property("jobtitle"))
                                .add(Projections.property("employee_info "))
                                .add(Restrictions.and(Property.eqName(emp_info.empId,emp_log.empId))
          return c1.list();

    } catch (RuntimeException re) {
        log.error("extractEmployeeAttributes failed", re);
        throw re;

    }

}
乔凯康
2023-03-14

当您谈论使用select语句执行连接时,您考虑的是数据库/纯SQL术语。Hibernate的威力(和危险)在于它将这个概念从你身上抽象出来,让你用对象的方式思考。您需要的是这两个对象之间的关系,然后让Hibernate处理这个关系。

我建议您花些时间阅读以下内容:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html

更好地了解Hibernate如何提供帮助。

彭朝
2023-03-14

EmployeeInfoForm和EmployeeLoginForm之间有一个关联,我在您的代码中没有看到。也许那里有员工班?如果是这样的话,那么你需要补充一点。因此,让我们假设每个员工都有多种形式。然后,您将对关系的员工端进行如下编码:

 public class Employee{

      @OneToMany(cascade = CascadeType.ALL, mappedBy = "employee")
      private Set<EmployeeLoginForm> loginForms = new HashSet<EmployeeLoginForm>();

      ...
 }

以及员工LoginForm类中关系的多面:

 @ManyToOne
 Employee employee;

这将创建表结构,以便:

 emploee = (id, etc ...)
 employeelogin = (id, employee, ....)

现在,任何时候需要员工登录列表时,都可以从Employee对象获得,而无需查询。

 Set<EmployeeLoginForm> logins = e.getLoginForms(); //where e is an employee object.

如果您确实想查询,您可以这样做

 select o from EmployeeLoginForm o join o.employee

但在这种情况下,这是不必要的。

 类似资料:
  • 问题内容: 我正在使用Spring和Hibernate和MySQL开发应用程序。我是Hibernate的新手,做了基本任务… 现在,我需要在选择查询中应用联接,以使用注释从多个表中获取数据。我已经搜寻过,但仍然不知道… 这是我的数据库表和bean类: 我的bean类是: EmployeeInfoForm.java EmployeeLoginForm.java 需求: 我想选择字段 EMPID,em

  • 我是一个新的探索Spring启动和冬眠,并面临一个问题,我认为这并不是新的。然而,在所有的建议都到位的情况下,我仍然找不到一个方法来解决我目前面临的问题。 你们谁能指出我错在哪里吗? 以下是场景- 我有一个Category类,并且Category类的每个实例可以有许多子Category的实例。 我已经使用@OneTomany注释设置了关系。然而,当试图将记录保存到数据库时,我面临的是org.hib

  • 我对Spring中的原生查询有一个问题。我在param value中使用了带有参数nativequery=true注释@query和SQL查询。 而在RezerWacjamanager.java中: 问题是什么时候调用方法RezerWacjadao.getDoStepnosCnatypy(dataOd,dataDo)并执行此查询。我得到一个错误错误: DoStepNosCtypyListdTo.j

  • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?

  • 我正在使用spring boot 2.1.7.Release和spring-kafka 2.2.7.Release.并且我正在使用@KafKalistener注释来创建一个消费者,并且我正在使用消费者的所有默认设置。 根据apache kafka文档,'max.poll.records'的默认值是500。 在这里,我试图理解spring是如何处理记录处理的。现在我的问题是,如果我们已经在主题a上发