#java #hibernate #hql
#java #гибернация #hql
Вопрос:
У меня действительно есть проблема с запросом spring и hibernate.
У меня есть класс с именем Car, который сопоставляет ManyToMany с моим классом Inventory. Инвентарь, кстати, не содержит ссылок на класс Car. Это приводит к тому, что spring и hibernate создают таблицу сопоставления car_loading с fk для car и fk для таблицы инвентаризации.
Теперь я хочу запросить инвентарь для специального автомобиля:
String squery = "SELECT i from Inventory i, car_loading loads WHERE i.id = loads.loading AND car = ?";
Но я получаю исключение
org.hibernate.hql.ast.QuerySyntaxException: car_loading is not mapped
К вашему СВЕДЕНИЮ: Hibernate не поддерживает СОЕДИНЕНИЕ ДЛЯ x.a = y.b, что заставляет меня сделать это таким образом…
Заранее спасибо за любую помощь!
РЕДАКТИРОВАТЬ — мое сопоставление
public class Car {
@OneToOne
private Driver driver;
@ManyToMany(cascade=CascadeType.ALL)
private List<Inventory> loading = new ArrayList<Inventory>();
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(pattern="dd:MM:yyy HH:mm")
private Date lastModified;
//...
}
public class Inventory {
private Integer shouldAmount;
private Integer minAmount;
private Integer isAmount;
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(pattern="dd:MM:yyy HH:mm")
private Date lastModified;
//..
}
Ответ №1:
Вы никогда не должны использовать таблицу сопоставления явно, hibernate добавляет ее автоматически при использовании свойств объекта. Для вашей ситуации запрос должен выглядеть следующим образом:
"select c.loading from Car c where c = ?"
или просто получите объект car Car car = session.get(Car.class, id)
, затем используйте getter в качестве обычного Collection<Inventory> loading = car.getLoading();
Комментарии:
1. Я не могу использовать c.loading, потому что загрузка не является полем в Car, вызывающим исключение неизвестной загрузки поля. Это моя проблема, ссылка однонаправленная
2. Покажите свои классы и сопоставление, пожалуйста.
3. Хм, кажется, у меня все еще есть проблемы с этим. Попробовал это с помощью собственного запроса с использованием объединений, но у меня на рабочем сервере возникли проблемы с этим, я опубликовал свое сопоставление…
4.
Car.loading
это поле «многие ко многим». Почему это неизвестно? Используете ли вы HQL? Это очень простой вариант использования hibernate. Возможно, вы делаете что-то не так в инфраструктурном коде. Попробуйте составить минимальный тестовый пример.
Ответ №2:
Я увидел этот вопрос и хотел его обновить. Я сделал это неправильно. Я мог бы просто запросить car и вернуть все inventorys в этом car. Потому что существует связь между автомобилем и инвентарем, но не наоборот. Итак, запрос определенного автомобиля и просто возврат атрибута списка инвентаря сделали это за меня…