hibernate - 使用条件从两个表中获取数据

时间:2015-03-21 16:40:24

标签: java mysql hibernate join

我有一个表DocMaster,它与DocMovement表有一对多的映射。 DocMovement表包含的列包含发送和接收用户ID,其中包含发送和接收文档的日期作为单独的列。

//Doc_Mvmnt
    @ManyToOne
    @JoinColumn(name = "BARCODE", nullable=false)
    public Doc_Master doc_master;

    @ManyToOne
    @JoinColumn(name="RECIPIENT_DETAIL")
    private User_Details recipient_detail;

    @ManyToOne
    @JoinColumn(name="SENDER_DETAIL")
    private User_Details sender_detail;

    @Temporal(TemporalType.DATE)
    //@Type(type="date")
    @Column(name="RECIEVING_DATE")
    private Date recieving_date;

    @Temporal(TemporalType.DATE)
    @Column(name="SENDING_DATE")
    private Date sending_date;

//Doc_Master
    @Column(name = "BARCODE", nullable=false, unique=true)
    private String barcode;

    @ManyToOne
    @JoinColumn(name = "DEPT_ID")
    private Department department;

//Department
    @OneToMany(mappedBy= "department")
    private List<Doc_Master> documents = new ArrayList<>();

我面临的问题是:

用户输入部门和日期范围。我想显示该部门的所有日期范围内的所有文档移动。我无法编写条件以便我可以获取所需的数据。

Criteria criteria = session.createCriteria(Doc_Master.class);
criteria.add(Restrictions.eq("department", deptId));
criteria.add(Restrictions.between(/* */, fromDate, toDate)); // what to do here
List<Doc_Master> documents = (List<Doc_Master>)criteria.list();

请帮忙!!!

2 个答案:

答案 0 :(得分:1)

您需要使用createAlias。

Criteria criteria = session.createCriteria(Doc_Master.class,"docMaster");
.createAlias("docMaster.docMovement","docMovement")
criteria.add(Restrictions.eq("docMaster.department",deptId));
criteria.add(Restrictions.between("docMovement.recieving_date", fromDate, toDate));

您需要在documentMaster中设置documentMovement对象。

其中

  

docMovement是docMaster

中的对象名称

答案 1 :(得分:1)

  
    

用户输入部门和日期范围。我希望显示该部门的所有日期范围内的所有文档移动。

  

首先,您应该查询Doc_Mvmnt而不是Doc_Master(您应该避免使用类名称的下划线):

Criteria criteria = session.createCriteria(Doc_Mvmnt.class);

请注意,使用当前映射时,无法从主导航导航到移动。这是从运动到掌握的单向联系。

接下来,您不是要查询部门,而是部门ID:

criteria.add(Restrictions.eq("doc_master.department.id", deptId));

  
    

//在这做什么

  
criteria.add(Restrictions.or(
    Restrictions.between("sending_date", fromDate, toDate),
    Restrictions.between("recieving_date", fromDate, toDate)));
相关问题