Как позвонить в Named Query - PullRequest
       18

Как позвонить в Named Query

20 голосов
/ 30 апреля 2010

Я написал именованный запрос в классе сущностей Voter

NamedQuery(name = "Voter.findvoter", query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password),

Я хочу вызвать этот именованный запрос, а также мне нужно установить voterID и пароль.

Можете ли вы помочь мне. Спасибо

Ответы [ 4 ]

38 голосов
/ 30 апреля 2010

Полагаю, вы пропустили символ @ в аннотации NamedQuery?

В коде вы бы назвали это так:

List results = em.createNamedQuery("Voter.findvoter")
    .setParameter("voterID", "blah")
    .setParameter("password","blahblahblah")
    .getResultList();
4 голосов
/ 22 июня 2012

Есть две очевидные проблемы с вашим именованным запросом, которые могут вызвать проблемы:

  • Это аннотация, поэтому она должна быть @NamedQuery, а не просто NamedQuery
  • Ваш запрос в настоящее время:

query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password.

Проблема в том, что вы завершаете свою строку после :voterID, а не после :password, и у вас есть «где» дважды, и у вас есть пробел между:: и «паролем». Ваш запрос должен выглядеть следующим образом:

query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID and v.password= :password"

(я только что переместил «в конец» и удалил второе «где» и пробел после «:»)

2 голосов
/ 06 мая 2010

Общие шаги (именованный запрос или иное)

  1. Создать запрос - у них есть пять методов создания.
  2. Установите запрос с параметрами при необходимости - интерфейс запроса имеет эти методы.
  3. Выполнить запрос - интерфейс запроса имеет 3 метода, связанных с выполнением.

с помощью указанных трех шагов вы можете выполнить любой запрос JPA.

1 голос
/ 21 апреля 2017

На самом деле Брент прав, ваш NameQuery должен выглядеть примерно так:

@NamedQuery(name = "Voter.findvoter", query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID AND where v.password = :password")
@Entity
public class Voter implements Serializable{ ... }

и где-то еще вы должны попробовать это (что Дик уже сказал)

public class VoterFasade{
    public List<Voter> findVoter(long id,String password){
        List<Voter> results = em.createNamedQuery("Voter.findvoter")
            .setParameter("voterID", id)
            .setParameter("password",password)
            .getResultList();
        return result;
    }
}

тогда вы можете использовать его как

@Inject
VoterFasade voterFasade;

///
long id=12;
voterFasade.findVoter(id);

должен действительно работать. (Это не скомпилированный код).

Вы также можете сделать это с репозиторием, проверьте ссылку ниже, часть Репозитарий Листинг23. Пример репозитория введите описание ссылки здесь

...