Как создать NamedQuery «findByDate» в JPQL? - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь создать @NamedQuery для веб-службы, чтобы можно было возвращать список клиентов, которые имеют данную дату рождения.

GlassFish сообщает о следующей ошибке:

Описание исключения: проблема компиляции [SELECT c ОТ клиента c WHERE c.dob = to_date (: dob, 'dd-Mon-yyyy')]. [38, 45] Идентификационная переменная to_date не определена в предложении FROM.

@NamedQuery(name = "Customer.findByDob", query = "SELECT c FROM Customer c WHERE c.dob = to_date(:dob, 'dd-Mon-yyyy')")

@GET
    @Path("findByDob/{dob}")
    @Produces({"application/json"})
    public List<Customer> findByDob(@PathParam("dob") String dob) {
        Query q = em.createNamedQuery("Customer.findByDob");
        q.setParameter("dob", dob);
        return q.getResultList(); 
}

Любая обратная связь очень ценится.

1 Ответ

1 голос
/ 22 марта 2019

Вы можете делегировать преобразование из формата базы данных Date в String в менеджере сущностей. Примерно так должно работать:

@NamedQuery(name = "Customer.findByDob", query = "SELECT c FROM Customer c WHERE c.dob = :dob")

        @GET
        @Path("findByDob/{dob}")
        @Produces({"application/json"})
        public List<Customer> findByDob(@PathParam("dob") String dob) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd-Mon-yyyy");
            Date dobDate = sdf.parse(dob); //Create a new Java Date object. 

            Query q = em.createNamedQuery("Customer.findByDob");
            q.setParameter("dob", dobDate); //The entity manager will transform the Date to query needs.
            return q.getResultList(); 
    }
...