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

Java hibernate-使用条件从两个表中获取数据,java,mysql,hibernate,join,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")

我有一个表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<>();
//Doc\u Mvmnt
@许多酮
@JoinColumn(name=“BARCODE”,null=false)
公共文件主控文件主控文件;
@许多酮
@JoinColumn(name=“收件人详细信息”)
私人用户详细信息收件人详细信息;
@许多酮
@JoinColumn(name=“发送方详细信息”)
私人用户详细信息发送者详细信息;
@时态(TemporalType.DATE)
//@类型(Type=“日期”)
@列(name=“接收日期”)
私人日期接收日期;
@时态(TemporalType.DATE)
@列(name=“发送日期”)
私人日期发送日期;
//博士硕士
@列(name=“BARCODE”,null=false,unique=true)
私有字符串条形码;
@许多酮
@JoinColumn(name=“DEPT\u ID”)
私人部门,;
//系
@OneToMany(mappedBy=“部门”)
私有列表文档=新的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();
Criteria=session.createCriteria(Doc\u Master.class);
标准。添加(限制。eq(“部门”,部门),部门);
条件。添加(限制。介于(/**/,fromDate,toDate));//在这里做什么
列表文档=(列表)条件。列表();

请帮忙

您需要使用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中的对象名称

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

首先,您应该查询
Doc\u Mvmnt
,而不是
Doc\u Master
(您应该避免在类名中使用下划线):

Criteria=session.createCriteria(Doc\u Mvmnt.class)

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

接下来,您查询的不是部门,而是部门id:

criteria.add(Restrictions.eq(“doc_master.department.id”,deptId))

//在这里做什么


首先编写您的常规sql查询..对不起,我不擅长编写查询您告诉我的第一个条件“doc\u master.department.id”在我的情况下“doc\u master.department.deptId”不起作用。我得到的异常是“org.hibernate.QueryException:无法解析属性:doc\u master.department.deptId of:database.doc\u Mvmnt”。你能帮忙吗?也许是打字错误。例如,在查询中,
doc\u master.barcode
是否对您起作用?receiving\u date属性属于doc\u Mvmnt类,因此我无法将receiving\u date属性用于docMaster条件:/ya您是对的。您可以尝试此…“docMovement.receiving\u date”
criteria.add(Restrictions.or(
    Restrictions.between("sending_date", fromDate, toDate),
    Restrictions.between("recieving_date", fromDate, toDate)));