アプリケーションのクエリに問題があります。これは、クエリを実行するクエリ メソッドです。
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;
}
}
そして、これはエラーです:javax.ejb.EJBException
そして、私が見つけたトレースで:
原因: java.lang.IllegalArgumentException: EntityManager でクエリを作成中に例外が発生しました: 例外の説明: [SELECT * FROM PRODUCT WHERE CATEGORY='Humano'] の解析中に構文エラーが発生しました。[22、22] select ステートメントには FROM 句が必要です。[7, 7] 算術式に左式がありません。[9, 22] 右式は算術式ではありません
何か案は?私の目的は、Web ページの JSF データテーブルを更新することです。
@Ilyaの回答に基づいてコードを編集したところ、この例外が発生しました
原因: java.lang.IllegalArgumentException: EntityManager でクエリを作成中に例外が発生しました: 例外の説明: [SELECT p FROM PRODUCT p WHERE CATEGORY='Humano'] のコンパイルで問題が発生しました。[14、21] 抽象スキーマ タイプ 'PRODUCT' は不明です。[30, 38] FROM句に識別変数「CATEGORY」が定義されていません。
@Ilya のリクエストに応じて、Product
クラスを投稿します。編集: 注釈に @Table を追加しました。
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 + " ]";
}
}
これまでご協力いただきありがとうございました。ここで、アプリケーションに別のクエリを投稿します。これは正しく機能しています。
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();
}
}