2013-06-24 99 views
0

我在我的实体类中有一个查询,并且正在使用JPA注释。我的BETWEEN语句返回结果,但我似乎无法标记此条件的“WHERE e.feature =:feature”,它引用另一个表中的字符串值。向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的I类有这个疑问,其中EM是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) 

该查询是从BusinessObject的查询方法调用时返回空指针异常的一个:

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

什么想法? 谢谢

+0

定义“无法得到查询工作” ......你得到一个异常,或者它只是没有返回正确的结果?另外,在你的例子中,你没有使用指定的查询。使用'em.createNamedQuery(“Events.getEventsBetweenDates”)' – DannyMo

+0

好的,请包含异常堆栈跟踪并指出代码中抛出异常的位置。 – DannyMo

+0

做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();