Как вызвать Named Query
Я написал именованный запрос в классе объектов Voter
NamedQuery(name = "Voter.findvoter", query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password),
Я хочу вызвать этот именованный запрос, и мне также нужно установить идентификатор и пароль.
Вы можете мне помочь. Спасибо вам
Ответы
Ответ 1
Я предполагаю, что вы пропустили символ @в своей аннотации NamedQuery?
В коде вы бы назвали его следующим:
List results = em.createNamedQuery("Voter.findvoter")
.setParameter("voterID", "blah")
.setParameter("password","blahblahblah")
.getResultList();
Ответ 2
В вашем именованном запросе возникают две очевидные проблемы, которые могут вызвать проблемы:
- Это аннотация, поэтому она должна быть
@NamedQuery
не только NamedQuery
- Ваш запрос:
query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password
.
Проблема в том, что вы завершаете свою строку после :voterID
, а не после :password
, и у вас есть "where" дважды, и у вас есть пробел между ":" и "password". Ваш запрос должен выглядеть следующим образом:
query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID and v.password= :password"
(Я только что переместил "до конца" и удалил второй "where" и пробел после ":" )
Ответ 3
Общие шаги (именованный запрос или иначе)
- Создайте запрос - у него есть пять методов создания.
- Задайте запрос с параметрами, если это необходимо - интерфейс запроса имеет эти методы.
- Выполнить запрос - интерфейс запроса имеет три метода, связанных с выполнением.
с помощью трех шагов вы можете выполнить любой запрос JPA.
Ответ 4
На самом деле брант прав, ваш 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);
должен работать (его несвязанный код).
вы также можете сделать это с помощью репозитория, проверьте приведенную ниже ссылку, репозиторий репозитория Listing23.Example
введите ссылку здесь