Это схема моих таблиц, которую я использую для этого:
У меня есть дом, в котором может быть несколько квартир, каждая из которых может иметь одинВвод воды в месяц.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
на основе дома и даты?