代码之家  ›  专栏  ›  技术社区  ›  Alyona

冬眠。按对象从其他类中选择的条件查询?

  •  2
  • Alyona  · 技术社区  · 8 年前

    这是我用于此的表的架构: enter image description here

    我有一所房子,可以有几个公寓,每个公寓每月可以有一个进水口。 Water 对象保留在引用内 Flat . 平坦的 对象保留对的引用 House . 我想从数据库中选择基于当前月份和房子的所有条目。我试过这样做:

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

    但我有一个错误:

    java.lang.IllegalArgumentException: Unable to locate Attribute  with the the given name [house] on this ManagedType [home.accounting.model.Water]
    

    据我所知,这是因为 对象没有房子的直接引用。

    我应该如何修改我的 Criteria Query ,以便我可以选择 基于房屋和日期的表格?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Shubham Kadlag    8 年前

    正如你在图式中提到的,水指的是平的,而平的指的是房子,你可以先从根开始找平,然后从平的开始找房子。

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