我有一个表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();
请帮忙!!!
答案 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)));