2016-11-14 15 views
0

Я уже много часов пытаюсь сделать это правильно, но я просто не могу найти решение.Внутренний запрос и запрос по дате HQL

У меня есть таблица «Заказы» и таблица «События», где eventId является внешним ключом в Заказе. У меня есть список заказов, которые теперь фильтруются только по событию, но теперь я также хочу, чтобы он отфильтровывался по дате, поэтому я решил изменить запрос.

Я пытаюсь присоединиться к таблице событий, но я не могу заставить его работать. Это запрос:

@Transactional 
    @SuppressWarnings("unchecked") 
    public List<Orders> getOrders(Integer id){ 
//  java.util.Date utilDate = new SimpleDateFormat("yyyy-MM-dd").parse(test); 
//  java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
     hql = "FROM Orders o join o.eventId e where o.eventId=" +id ; 
     query = getCurrentSession().createQuery(hql); 
     return (List<Orders>) query.list(); 
    } 
+0

Ваш закомментированный код показывает, как вы объявили переменную для даты, но я не вижу ничего, что говорит нам, что вы пытались использовать эту дату в запросе, или что произошло, когда вы это пробовали; поэтому немного сложно сказать, что пошло не так. Тем не менее, я могу предположить, что использование параметров запроса является более эффективной практикой, чем объединение фрагментов запроса с значениями переменных, а в случае даты, в частности, существует меньше способов сделать ошибку с использованием параметров. –

+0

Я прокомментировал дату, потому что этот запрос работал раньше, не пытаясь присоединиться к таблице Event. Я сделал это, чтобы проверить, правильно ли я подключаюсь. Работает: hql = "FROM Orders o где o.eventId =" + id; Но это не работает: hql = "FROM Orders o join o.eventId e где o.eventId =" + id; – 1oneSquared

+0

'join o.eventId e' выглядит неправильно для меня. Похоже, вы пытаетесь присоединиться к «Orders» к столбцу в «Orders», а не к другой таблице. – JonK

ответ

0

Я думаю, вы должны удалить join o.eventId e, потому что когда вы пишете:

where o.eventId = ... 

HQL неявное преобразование вашего где условие соединения (между Порядком и собственности Event) и где условия.

Итак, попробуйте следующее:

@Transactional 
@SuppressWarnings("unchecked") 
public List<Orders> getOrders(Integer id){ 
    hql = "FROM Orders o where o.eventId=" +id ; 
    query = getCurrentSession().createQuery(hql); 
    return (List<Orders>) query.list(); 
} 
0

Есть так много проблем в вашем коде, что может пойти не так.

Во-первых, очевидно, что вы используете Hibernate неправильно. Вам нужно думать в сущности, а не в таблице. И, с вашего HQL, очевидно, что ваша сущность сопоставляется неправильно.

Он должен выглядеть следующим образом:

@Entity @Table(name="Orders") 
class Order { 
    @Id 
    private Integer id; 

    @ManyToOne(...) @JoinColumn(name="eventId") 
    private Event event; 
} 

@Entity @Table(name="Events") 
class Order { 
    @Id 
    private Integer id; 

    @Temporal(...) 
    private Date fooDate; 
} 

и ваш первоначальный HQL должен выглядеть следующим образом:

from Order o where o.event.id = :eventid 

и вы должны передать в параметре по

Query query = ....; 
query.setParameter("eventid", id); 

Построение HQL по пути можно легко разрешить впрыск sql


если вы отобразили поле даты правильно, запрос по дате нет ничего сложного:

Query q = session.createQuery("from Order o where o.event.fooDate = :foodate"); 
q.setParameter("foodate", dateParam); 
q.list(); 

Другая проблема кода явно неприемлемое место, чтобы поместить @Transactional