我的应用程序中的查询有问题.这是执行查询的查询方法:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误: javax.ejb.EJBException
在我看到的踪迹中:
引发者:java.lang.IllegalArgumentException:在EntityManager中创建查询时发生异常:异常描述:语法错误解析[SELECT*FROM PRODUCT WHERE CATEGORY ='Humano'].[22,22] select语句必须有一个FROM子句.[7,7]算术表达式中缺少左表达式.[9,22]正确的表达式不是算术表达式
有任何想法吗?我的目标是在我的网页中刷新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 + " ]";
}
}
Run Code Online (Sandbox Code Playgroud)
感谢你目前的帮助.在这里,我在我的应用程序中发布另一个查询,它正常工作:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Ily*_*lya 17
1)您应该为FROM子句中的表指定别名,而SELECT子句应该包含别名
Product应该是一个实体
em.createQuery("SELECT p FROM Product p WHERE p.category='" + category + "'");
Run Code Online (Sandbox Code Playgroud)
如果PRODUCT不是实体,您应该创建nativeQuery
em.createNativeQuery("SELECT p FROM PRODUCT p WHERE p.CATEGORY='" + category + "'");
Run Code Online (Sandbox Code Playgroud)
EntityManager :: createQuery用于JPQL(Java持久性查询语言)
EntityManager :: createNativeQuery用于SQL
2)"Unknown abstract schema type" 当JPA无法找到您的实体类时,JPA抛出错误还将实体
添加到persistence.xml
<persistence-unit ...>
<class>com.package.Product</class>
Run Code Online (Sandbox Code Playgroud)
3)添加@Table注释@Entity
4)正如我在文档中看到的,JPQL区分大小写.
除Java类和属性的名称外,查询不区分大小写.所以SeLeCT与sELEct和SELECT相同,但是org.hibernate.eg.FOO和org.hibernate.eg.Foo是不同的,foo.barSet和foo.BARSET也是如此.
所以JPQL查询应该是
SELECT p FROM Product p WHERE p.category = '...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23946 次 |
| 最近记录: |