6

アプリケーションのクエリに問題があります。これは、クエリを実行するクエリ メソッドです。

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();
   }
}
4

1 に答える 1