Java 冬眠从另一个类中按对象选择的条件查询?
这是我用于此目的的表的架构: 我有一所房子,可以有几个单元,每个单元每个月可以有一个进水口<代码>水对象包含Java 冬眠从另一个类中按对象选择的条件查询?,java,sql,hibernate,Java,Sql,Hibernate,这是我用于此目的的表的架构: 我有一所房子,可以有几个单元,每个单元每个月可以有一个进水口水对象包含平面的内部参照平面对象保存房屋的引用。我想从数据库中选择基于当前月份和房屋的所有条目。我试着这样做: public static List<Water> getAll(Date date, House house){ List<Water> waterList = null; Calendar myCalendar = Calendar.getInstan
平面
的内部参照<代码>平面对象保存房屋
的引用。我想从数据库中选择基于当前月份和房屋的所有条目。我试着这样做:
public static List<Water> getAll(Date date, House house){
List<Water> waterList = null;
Calendar myCalendar = Calendar.getInstance();
myCalendar.setTime(date);
myCalendar.set(Calendar.DAY_OF_MONTH, 1);
Date monthStart = new java.sql.Date(myCalendar.getTimeInMillis());
myCalendar.add(Calendar.DAY_OF_MONTH,
(myCalendar.getMaximum(Calendar.DAY_OF_MONTH) - myCalendar.get(Calendar.DAY_OF_MONTH)));
Date monthEnd = new java.sql.Date(myCalendar.getTimeInMillis());
Session sess = mainApp.getSessionFactory().openSession();
Transaction tx = null;
try {
tx = sess.beginTransaction();
// create criteria builder
CriteriaBuilder builder = sess.getCriteriaBuilder();
// create criteria
CriteriaQuery<Water> query = builder.createQuery(Water.class);
// specify criteria root
Root<Water> root = query.from(Water.class);
query.select(root)
.where(builder.and(builder.equal(root.get("house"), house),
builder.greaterThanOrEqualTo(root.get("date"), monthStart),
builder.lessThanOrEqualTo(root.get("date"), monthEnd)));
waterList = sess.createQuery(query).getResultList();
tx.commit();
} catch (Exception e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
} finally {
sess.close();
}
return waterList;
}
据我所知,这是因为水
对象对房屋没有直接的参考
我应该如何修改我的
条件查询
,以便我能够根据房子和日期选择Water
表中的所有记录?正如您在模式中提到的,Water引用了flat,flat引用了house,您可以先从根获取flat,然后从flat获取house
query.select(root)
.where(builder.and(builder.equal(root.get("flat").get("house"), house),
builder.greaterThanOrEqualTo(root.get("date"), monthStart),
builder.lessThanOrEqualTo(root.get("date"), monthEnd)));
你有没有试过使用root.get(“flat”).get(“house”)它可以工作!你能把它贴出来作为答案吗?这样我就可以接受了。我也要投票表决
query.select(root)
.where(builder.and(builder.equal(root.get("flat").get("house"), house),
builder.greaterThanOrEqualTo(root.get("date"), monthStart),
builder.lessThanOrEqualTo(root.get("date"), monthEnd)));