Гибернация запроса внутреннего соединения для неотмеченной таблицы (однонаправленная)

#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. Потому что существует связь между автомобилем и инвентарем, но не наоборот. Итак, запрос определенного автомобиля и просто возврат атрибута списка инвентаря сделали это за меня…