Сначала вы должны сделать select
, а не просто "from Receipt where active='Y' and id=:id "
(я предполагаю, что это несущественная ошибка, но на всякий случай, если это не так):
String query = "
SELECT receipt
FROM Receipt receipt
WHERE receipt.id = :yourId "
Для создания запроса я используюEntityManager.Вот пример класса и как он работает для меня.
public class EntityManagerUtil {
private static EntityManagerFactory entityManagerFactory = null;
private static final ThreadLocal<EntityManager> entitymanager =
new ThreadLocal<EntityManager>();
private static final ThreadLocal<Map<Class<?>, Set<Serializable>>>collectionFieldNameValues =
new ThreadLocal<Map<Class<?>, Set<Serializable>>>();
public static EntityManagerFactory initializeEntityManagerFactory( String persistenceUnit ) {
if ( entityManagerFactory == null ) {
entityManagerFactory = Persistence.createEntityManagerFactory( persistenceUnit );
}
return entityManagerFactory;
}
public static EntityManager getEntityManager() {
EntityManager entityManager = entitymanager.get();
// Create a new EntityManager
if ( entityManager == null || !entityManager.isOpen()) {
entityManager = entityManagerFactory.createEntityManager();
entitymanager.set( entityManager );
}
return entityManager;
}
public static void close() {
final EntityManager entityManager = entitymanager.get();
entitymanager.set( null );
if ( entityManager != null && entityManager.isOpen()) {
entityManager.close();
}
if ( entityManagerFactory != null && entityManagerFactory.isOpen()) {
entityManagerFactory.close();
}
}
}
А в своем классе, для которого вы хотите получить данные, вы сначала инициализируете EntityManagerFactory с помощью модуля персистентности (чтобы, скажем, он назывался ReceiptPersistence).Вот как это будет выглядеть:
EntityManagerUtil.initializeEntityManagerFactory("ReceiptPersistence");
EntityManagerUtil.getEntityManager().getTransaction().begin();
Query getReceiptWithId = EntityManagerUtil.getEntityManager().createQuery(query);
getReceiptWithId.setParameter("yourId", idThatYouWant);
Теперь, когда ваш запрос готов, вы можете получить один результат из него с помощью getSingleResult ():
Receipt receipt = (Receipt) getReceiptWithId.getSingleResult();
EntityManagerUtil.getEntityManager().getTransaction().commit();
EntityManagerUtil.getEntityManager().close();
, если вы сделаете этоПопробуйте / поймать (рекомендуется), вы можете сделать EntityManagerUtil.getEntityManager().getTransaction().rollback();
Это необходимо, когда вы делаете некоторые изменения в БД.
Я использую ThreadLocal, чтобы быть уверенным, что для каждого пользователя будет 1 поток.