Hibernate.Критерии Запрос на выбор по объекту из другого класса? - PullRequest
0 голосов
/ 29 мая 2018

Это схема моих таблиц, которую я использую для этого: enter image description here

У меня есть дом, в котором может быть несколько квартир, каждая из которых может иметь одинВвод воды в месяц.Water объект содержит внутреннюю ссылку для Flat.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]

Как я понимаю, это потому, что объект Water не имеет прямой ссылки на дом.

Как мне изменить мой Criteria Query, чтобы я мог выбрать все записи в таблице Water на основе дома и даты?

1 Ответ

0 голосов
/ 29 мая 2018

Как вы упомянули в схеме, вода имеет ссылку на квартиру, а квартира имеет ссылку на дом, вы можете получить дом, сначала получив квартиру от корня, а затем дом от квартиры.

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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...