2017-02-28 8 views
0

私は2つのクラスを持っていますが、その間には1対多の関係があります。これらのクラスは以下のとおりです。HQLを使用する1対多の関係を持つ結合テーブルから選択します

@Entity 
@Table(name = "emp300", uniqueConstraints = @UniqueConstraint(columnNames = {"personId", "empName","last_name"})) 
public class Employee implements Serializable{ 

    @SequenceGenerator(name="seq",sequenceName="my_seq") 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq") 
    @Id 
    private int Pid; 


    private String empName, last_name, position, boss,personId; 
    private String birthDate; 
    private int salary; 


    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "depId", nullable = false) 
    private Department department; 
    //setters and getters 
    } 

と第二1:

@Entity 
@Table(name = "dep300", uniqueConstraints = @UniqueConstraint(columnNames = "depName")) 
public class Department implements Serializable, Comparable<Department> { 

    @SequenceGenerator(name = "seq", sequenceName = "DEPARTMENTS_SEQ") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq") 
    @Id 
    private int depId; 

    private String depName; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "department", cascade=CascadeType.ALL) 
    private Set<Employee> lst = new HashSet<Employee>(0); 
    //setters and getters 
    } 

今私は白のHQLは

答えて

0
(パラメータ部門名を渡す)各部門のすべての従業員のフィールドを取得するために命令することができる方法に興味を持っています

Employeeクラスからdepartmentを選択しようとしましたか? depName =:passingParam

from Employee e where e.department.depName = :passingParam; 
+0

例外を。 hibernate.hql.QueryExecutionRequestException:選択クエリではサポートされていません[ge.ufc.hibernate.Emps.Employee eからe.department.depName =:mname] – Gog1nA

+0

これを試すと、パラメータと等しい文字の間にスペースを入れてくださいthis: 従業員eからのe.department.depName =:mname; または、パラメーターを渡すことに問題がないことを確認するために、特定の部門名を照会で修正する必要があります。 –

1

は、まず、これはあなたが部門をフェッチするときに、すべての従業員の作業を取得するのに役立ちます部門のクラスを次のように変更

public class Department implements Serializable, Comparable<Department> { 
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "department", cascade=CascadeType.ALL) 
    private Set<Employee> lst = new HashSet<Employee>(0); 
} 

を行います。

次に、リポジトリクラスにメソッドを追加します。私はあなたがこの作業を完了させるために何らかの形のSpringデータCRUDリポジトリを使用すると仮定します。 設定に応じて必要がない場合は、変更してください。

public interface DepartmentRepository extends JpaRepository<Department, Integer> { 
    @Query("SELECT d from Department d where d.depName = :depName") 
    Department getDepartmentByName(@Param("depNamename") String depName) 
} 

これが役に立ちます。ハッピーコーディング!

+0

この変更後に例外があります。同じ例外:スレッド "main"の例外org.hibernate.QueryException:パス[d.depName]、予期しないトークン[d]を解決できません[ge.ufc.hibernate.Emps.Departmentからdを選択します.d.depName =:depName ] – Gog1nA

+0

@Query( "SELECT d from Department where d.depName =:depName") エイリアス "d"が存在しないので、これは次のようになります。 @Query( "部門dのSELECT dはd.depName = depName ") –

+0

回答が更新されました。あなたが作ってくれてうれしいです! –

0

怠け者のままにしておきます。そうしないと、必要のないときに他のクエリの結合が導入されます。

は、従業員のリストを取得するには、次のクエリを使用します。

SELECT e FROM Employee e WHERE e.department.depName = :departmentName 

またはフェッチされた従業員と部門の一覧を取得するには、次のスレッド「メイン」組織で

SELECT d FROM Department d LEFT JOIN FETCH d.lst WHERE d.depName IN (:departmentNames) 
関連する問題