2013-06-24 3 views
0

У меня есть запрос в классе сущности и я использую аннотации JPA. Оператор BETWEEN возвращает результаты, но я не могу пометить это условное выражение «WHERE e.feature =: feature», которое ссылается на значение String в другой таблице.Добавить условный оператор JPQL BETWEEN

@Entity 
@Table(name = "EVENTS") 
public class Events implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long eventsPk; 
    @ManyToOne 
    @JoinColumn(name = "USERS") 
    private Users user; 
    @ManyToOne 
    @JoinColumn(name = "FEATURES") 
    private Features feature; 
    @Column(name = "TIME_OF_ENTRY", unique = false) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date timeOfEntry; 
... 
} 

В моем классе BusinessObject у меня есть этот запрос, где Ет экземпляр EntityManager:

public class EventsBusinessObject { 
    private static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(EventsBusinessObject.class); 
    public static List<Events> getEventsBetweenDates(EntityManager em, Date startDate, Date endDate, String feature) { 
     List<Events> events = null; 
     try { 
      events = em.createQuery(
        "SELECT e FROM Events e WHERE e.timeOfEntry 
        BETWEEN :startDate AND :endDate 
        AND SELECT Feature f FROM Features WHERE f.feature = :feature") 
        .setParameter("startDate", startDate, TemporalType.TIMESTAMP) 
        .setParameter("endDate", endDate, TemporalType.TIMESTAMP) 
        .setParameter("feature", feature) 
        .getResultList(); 
     } catch (NoResultException e) { 
      logger.error("NoResultException for EventsBusinessObject.getEventsBetweenDates"); 
     } catch (Exception e) { 
      logger.error("unknown exception for EventsBusinessObject.getEventsBetweenDates"); 
     } 
     return events; 
    }//end getEventsBetweenDates method 

Следующая JPQL возвращает записи в порядке:

SELECT e FROM Events e WHERE e.timeOfEntry BETWEEN :startDate AND :endDate 

Это когда я начинаю пытаться добавьте функцию условное, что я не получаю никаких результатов в базе данных:

> @NamedQuery(name = "Events.getEventsBetweenDates", query = "SELECT e 
> from Events e WHERE e.timeOfEntry BETWEEN :startDate AND :endDate" AND 
> e.feature = :feature) 

Этот запрос был один, который возвращает NullPointerException, когда вызывается из метода запроса BusinessObject:

SELECT e FROM Events e WHERE e.timeOfEntry BETWEEN :startDate AND :endDate AND e.feature = :feature 

какие идеи? Thanks

+0

Определение «не может получить запрос на работу» ... вы получаете исключение или он просто не возвращает правильные результаты? Кроме того, в вашем примере вы не используете именованный запрос. Используйте 'em.createNamedQuery (« Events.getEventsBetweenDates »)' – DannyMo

+0

Хорошо, пожалуйста, включите трассировку стека исключений и укажите, где в вашем коде генерируется исключение. – DannyMo

+0

do em.createNamedQuery никогда не работал для меня в прошлом. Я думаю, что это не названные запросы. Я буду ссылаться на их запросы JPQL, а затем – joshpt

ответ

0

Меня осенило, что я могу использовать автоматическую полную функциональность Netbeans, чтобы помочь мне. Когда вы выполняете @NamedQuery() в классе сущности, вы можете сделать ярлык control + пробел, чтобы Netbeans рассказывал вам, какие параметры синтаксически правильны.

Это запрос, который работал для меня:

events = em.createQuery("SELECT e FROM Events e WHERE e.feature.name = :featureName AND e.timeOfEntry BETWEEN :startDate AND :endDate") 
      .setParameter("startDate", startDate, TemporalType.TIMESTAMP) 
      .setParameter("endDate", endDate, TemporalType.TIMESTAMP) 
      .setParameter("featureName", featureName) 
      .getResultList();