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();
}
}
C'est vrai, merci pour les conseils
OriginalL'auteur Jean Carlos Suárez Marranzini | 2013-10-16
Vous devez vous connecter pour publier un commentaire.
1) Vous devez spécifier l'alias de tables dans
FROM
clause, etSELECT
clause contient des aliasProduct
doit être une entitéSi
PRODUCT
n'est pas une entité, vous devez créernativeQuery
EntityManager::createQuery est pour JPQL (Java Persistence query language)
EntityManager::createNativeQuery est pour SQL
2) JPA jette le
"Unknown abstract schema type"
erreur lors de la JPA ne parvient pas à localiser votre classe d'entitéÉgalement ajouter une entité à persistence.xml
3) Ajouter
@Table
annotation à votre@Entity
4) Comme je le vois dans la documentation, JPQL est sensible à la casse.
Donc JPQL requête doit être
est
Product
une entité? AjouterProduct
classeIl serait préférable d'ajouter des paramètres à l'aide des paramètres nommés au lieu de simplement ajouter leurs valeurs naïvement comme ça. Notez que ces fuites de rendre votre application ouverte à des attaques par Injection SQL.
JPA sera jette l'
"Unknown abstract schema type"
erreur lors de la JPA ne parvient pas à localiser votre classe d'entitépeut être sensible à la casse analyseur est utilisé. Essayez
SELECT p FROM Product p WHERE p.category=' ...
au lieu de majusculesOriginalL'auteur Ilya