我的应用程序中的查询有问题。这是执行查询的查询方法:
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]右表达式不是算术表达式
有什么想法吗?我的目标是刷新网页中的JSF数据表。
根据@Ilya的回答编辑了我的代码,现在我得到了这个例外
原因:java。lang.IllegalArgumentException:在EntityManager中创建查询时发生异常:异常描述:编译问题[SELECT p FROM PRODUCT p WHERE CATEGORY='Humano']。[14,21]抽象模式类型“PRODUCT”未知。[30,38]FROM子句中未定义标识变量“CATEGORY”。
根据@Ilya的要求,我发布了我的产品,class:EDIT:Added@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();
}
}
1) 您应该在FROM子句中为表指定别名,并且SELECT子句应该包含别名。产品应该是一个实体
em.createQuery("SELECT p FROM Product p WHERE p.category='" + category + "'");
如果产品不是实体,则应创建nativeQuery
em.createNativeQuery("SELECT p FROM PRODUCT p WHERE p.CATEGORY='" + category + "'");
EntityManager::createQuery用于JPQL(Java持久性查询语言)
EntityManager::createNativeQuery用于SQL
2)当JPA无法找到您的实体类时,JPA会抛出“未知抽象模式类型”
错误
还将实体添加到persistence.xml
<persistence-unit ...>
<class>com.package.Product</class>
3)将@Table
注释添加到您的@Entity
4)正如我在留档中看到的,JPQL区分大小写。
除了Java类和属性的名称外,查询不区分大小写。所以SeLeCT和SeLeCT是一样的,但是org。冬眠例如,FOO和org。冬眠Foo和Foo都不一样。barSet和foo。BARSET。
所以JPQL查询应该是
SELECT p FROM Product p WHERE p.category = '...
问题内容: 我正在将旧数据库迁移到我的Rails应用程序(3.2.3)中。原始数据库带有相当多的长SQL查询报表。就目前而言,我想使用Rails应用程序中的sql查询,然后(在时间允许的情况下)将sql查询一一交换为“适当的” Rails查询。 我有一个临床模型,控制器具有以下代码: 但是,当我运行该代码时,会遇到一些与格式有关的错误。 在将它导入控制器之前,我应该对sql查询做些什么?尽管查询可
null 此外,EntityManager的作用域应该是请求(或会话或方法)吗? 谢谢,克里西
但是生成的SQL查询是 正如您所看到的,括号改变了,我相信两个查询中的条件并不相同。是虫子吗?使用hibernate和spring以及postgresql数据库。
问题内容: 假设我将与关联的表存储如下(代表事件的时间戳): 这样我们可以说: 用户1具有ADBCB的事件序列 用户2具有事件序列BBAAC 我想针对这些用户回答的问题类型非常容易表达为事件序列的常规表达式,例如“哪些用户的事件序列与A. * B匹配?” 或“哪些用户的事件序列与A [^ C] * B [^ C] * D匹配?” 等等。 在此表结构上可以用来回答类似查询的SQL技巧或运算符是什么?
下面是。我使用的是数据库。 上面的查询返回记录。如果在中执行上述查询,只需;但在spring和hibernate集成应用程序中,只需。我怎样才能提高性能? 谢谢!