0

エンティティ クラスにクエリがあり、JPA アノテーションを使用しています。私の BETWEEN ステートメントは結果を返しますが、別のテーブルの文字列値を参照するこの条件 "WHERE e.feature = :feature" にタグを付けることができないようです。

@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クラスには、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

データベースから結果が得られないのは、Feature 条件を追加しようとしたときです。

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

このクエリは、BusinessObject クエリ メソッドから呼び出されたときに NullPointerException を返すものでした。

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

何か案は?ありがとう

4

1 に答える 1

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();
于 2013-06-25T14:06:05.013 に答える