【问题标题】:hibernate - fetching data from two tables using criteriahibernate - 使用标准从两个表中获取数据
【发布时间】:2025-12-23 21:00:12
【问题描述】:

我有一个表 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();

请帮忙!!!

【问题讨论】:

  • 先写你正常的sql查询..我会帮忙
  • 对不起,不擅长写查询

标签: java mysql hibernate join


【解决方案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)));

【讨论】:

  • 你告诉的第一个标准,“doc_master.department.id”在我的例子中“doc_master.department.deptId”不起作用。我得到的异常是“org.hibernate.QueryException:无法解析属性:doc_master.department.deptId of:database.Doc_Mvmnt”。你能帮忙吗
  • 可能是错字。例如,doc_master.barcode 在查询中是否适合您?
【解决方案2】:

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

【讨论】:

  • recieving_date 属性属于 Doc_Mvmnt 类,因此我无法将 recieving_date 属性用于 docMaster 标准:/
  • 你是对的..你试试这个..."docMovement.recieving_date"