Requête SQL erreur dans le JSF, JPA application

J'ai un problème avec une requête dans mon application. C'est la méthode de requête en faisant la requête:

public List<Product> obtainProductListByCategory(String category)
   {
      Query query = em.createQuery("SELECT p FROM PRODUCT p WHERE CATEGORY='" + category + "'");
      List<Product> ret = query.getResultList();

      if (ret == null)
      {
         return new ArrayList<Product>();
      }
      else
      {
         return ret;
      }
   } 

Et c'est l'erreur: javax.ejb.EJBException

Et dans la trace que j'ai trouvé:

Causés par: java.lang.IllegalArgumentException: Une exception s'est produite lors de la création d'une requête dans l'EntityManager: Description de l'Exception: erreur de Syntaxe analyse [SELECT * from PRODUIT OÙ CATEGORY='Humain']. [22, 22] Une instruction select doit avoir une clause from. [7, 7], La gauche expression est manquant à partir de l'expression arithmétique. [9, 22] Le droit d'expression n'est pas une expression arithmétique

Des idées? Mon objectif est d'actualiser un JSF datatable dans ma page web.


Édité mon code @Ilya réponse, et maintenant j'ai cette exception

Causés par: java.lang.IllegalArgumentException: Une exception s'est produite lors de la création d'une requête dans l'EntityManager:
Description de l'Exception: Problème de compilation [SELECT p DE PRODUIT p where CATEGORIE='Humain'].
[14, 21] Le schéma abstrait de type "PRODUIT" est inconnu.
[30, 38] L'identification de la variable "CATÉGORIE" n'est pas défini dans la clause from.


Comme demandé par @Ilya, je poste mon Product classe:
EDIT: Ajout de @Table pour les annotations.

package model;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table
@Entity
public class Product implements Serializable, IProduct
{
private static final long serialVersionUID = 1L;
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private String name;
private int stock;
private float price;
private String category;
private String description;
@Override 
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Product()
{
}
public Product(String name, int stock, float price, String category, String description)
{
this.name = name;
this.stock = stock;
this.price = price;
this.category = category;
this.description = description;
}
@Override
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@Override
public float getPrice()
{
return price;
}
public void setPrice(float price)
{
this.price = price;
}
@Override
public int getStock()
{
return stock;
}
public void setStock(int stock)
{
this.stock = stock;
}
@Override
public int hashCode()
{
return name.hashCode();
}
@Override
public boolean equals(Object object)
{
if (!(object instanceof Product))
{
return false;
}
Product other = (Product) object;
if (name.equals(other.getName()))
{
return true;
}
return false;
}
@Override
public String getCategory()
{
return category;
}
@Override
public String toString()
{
return "Marketv2.model.Product[ name=" + name + " ]";
}
}

Merci pour l'aide pour l'instant. Ici je poste une autre question dans mon application, qui fonctionne correctement:

   public void removeProduct(Product g)
{
Query q = em.createQuery("SELECT x FROM BasketItem x WHERE x.product.name = '" + g.getName() + "'");
List<BasketItem> bItems = q.getResultList();
for (BasketItem i : bItems)
{
em.remove(i);
}
q = em.createQuery("DELETE FROM Product x WHERE x.name = '" + g.getName() + "'");
q.executeUpdate();
}
}
Veuillez ne pas supprimer les problèmes plus anciens, sinon les réponses qui ont essayé de résoudre ce problème devient non valide. Il suffit d'ajouter les informations pertinentes pour le problème spécifique.
C'est vrai, merci pour les conseils

OriginalL'auteur Jean Carlos Suárez Marranzini | 2013-10-16