Java 使用HQL从具有一对多关系的联接表中选择

Java 使用HQL从具有一对多关系的联接表中选择,java,oracle,hibernate,Java,Oracle,Hibernate,我有两门课,其间有一对多的关系。这些课程包括: @Entity @Table(name = "emp300", uniqueConstraints = @UniqueConstraint(columnNames = {"personId", "empName","last_name"})) public class Employee implements Serializable{ @SequenceGenerator(name="seq",sequenceName="my_seq")

我有两门课,其间有一对多的关系。这些课程包括:

@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 
    }
第二点:

@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
    }
@实体
@表(name=“dep300”,uniqueConstraints=@UniqueConstraint(columnNames=“depName”))
公共类部门实现了可序列化、可比较的{
@SequenceGenerator(name=“seq”,sequenceName=“DEPARTMENTS_seq”)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“seq”)
@身份证
私人内部部门;
私有字符串depName;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“department”,cascade=CascadeType.ALL)
私有集lst=新哈希集(0);
//二传手和接球手
}

现在我感兴趣的是如何使用白色HQL命令获取每个部门中的所有员工字段(传递参数department name)

您是否尝试使用子句is department从employee类中进行选择。depName=:passingParam

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

首先在系课上做以下改变

public class Department implements Serializable, Comparable<Department> {
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "department", cascade=CascadeType.ALL)
    private Set<Employee> lst = new HashSet<Employee>(0);
}
公共类部门实现可序列化、可比较{
@OneToMany(fetch=FetchType.EAGER,mappedBy=“department”,cascade=CascadeType.ALL)
私有集lst=新哈希集(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)
}
public interface DepartmentRepository扩展了JpaRepository{
@查询(“从部门d中选择d,其中d.depName=:depName”)
Department getDepartmentByName(@Param(“depNamename”)字符串depName)
}

希望这有帮助。快乐编码

让一切都保持懒散状态,否则在不需要连接时,您将为其他查询引入连接

使用以下查询获取员工列表:

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)

您编写的此更改后出现异常。相同的异常:线程“main”org.hibernate.QueryException中的异常:无法解析路径[d.depName],意外标记[d][从ge.ufc.hibernate.Emps.Department where d.depName=:depName中选择d]@Query(“从Department where d.depName=:depName中选择d”)缺少别名“d”所以它应该是这样的:@Query(“SELECT d from Department d where d.depName=:depName”)线程“main”org.hibernate.hql.QueryExecutionRequestException:不支持SELECT查询[from ge.ufc.hibernate.Emps.Employee e where e e.Department.depName=:mname]试试这个,参数和相等字符之间应该有一个空格,如下所示:from Employee e,其中e.department.depName=:mname;或者,您应该在查询中修复特定的部门名称,以确保传递参数没有问题。