6

MySQL で Spring と Hibernate を使用してアプリケーションを開発しています。私はHibernateを初めて使用し、基本的なタスクを行いました...

ここで、注釈を使用して複数のテーブルからデータを取得するために、選択クエリで結合を適用する必要があります。調べてみましたが、やはりわかりませんでした...

ここに私のデータベーステーブルとBeanクラスがあります:

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

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

そして、私のBeanクラスは次のとおりです。

EmployeeInfoForm.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;
}


}

EmployeeLoginForm.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 が両方のテーブルで一致する場合、 empid、empname、jobtitleフィールドをemployee_infoから、フィールドstatusemployee_loginテーブルから選択したい...

私の仕事を完了するのを手伝ってください...

任意の提案やガイダンスをいただければ幸いです...

4

3 に答える 3

6

コードに表示されていない EmployeeInfoForm と EmployeeLoginForm の間に関連付けがあります。たぶんそこに従業員クラスがありますか?その場合は、それを追加する必要があります。したがって、各従業員には多くのフォームがあると仮定しましょう。次に、リレーションシップの Employee 側を次のようにコーディングします。

 public class Employee{

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

      ...
 }

そして、EmployeeLoginForm クラスのリレーションシップの多側:

 @ManyToOne
 Employee employee;

これにより、次のようなテーブル構造が作成されます。

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

これで、従業員のログインのリストが必要なときはいつでも、クエリを必要とせずに従業員オブジェクトから取得できます。

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

クエリを実行したい場合は、実行できます

 select o from EmployeeLoginForm o join o.employee

しかし、この場合は不要です。

于 2013-03-11T13:29:03.327 に答える
5

selectステートメントで結合を実行することについて話すとき、データベース/純粋なSQL用語で考えています。Hibernate の威力 (および危険性) は、これを抽象化し、オブジェクトの用語で考えられるようにすることです。必要なのは、2 つのオブジェクト間の関係であり、Hibernate にこの関係を処理させます。

時間をかけてこれを読むことをお勧めします。

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

Hibernate がどのように役立つかをよりよく理解するために。

于 2013-03-11T13:26:29.227 に答える
2

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;

    }

}
于 2013-03-11T13:46:28.087 に答える