Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠从另一个类中按对象选择的条件查询?_Java_Sql_Hibernate - Fatal编程技术网

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)));