createNativeQuery()& createQuery() 与 NamedParameter

问题描述

我有一个实体 CategoryElement :

@Entity(name = "CategoryElement ")
@Table(name = "category_element")
public class CategoryElement {
 
 @Column(columnDeFinition = "varchar(100)",name = "farsi_name",nullable = false)
 private String farsiName;

  /* and other stuff*/  

我想为这个实体编写一个查询,就像我们在 preparedStatement 中所做的一样,但我得到了这个语法错误 cannot resolve symbol
这是我的查询

public List<CategoryElement> findByName(String farsiName) {
    EntityManager manager = HibernateUtils.getEntityManager();
    Query query = manager.createquery("select o from CategoryElement as o where o.farsi_name=:param");
    query.setParameter("param",farsiName);
    List categoryElementList = query.getResultList();
    manager.close();
    return categoryElementList;
}

我在第 3 行收到语法错误cannot resolve symbol 'CategoryElement ' 并且在第 4 行我收到关于 param
的相同消息 我试过这样的 CreateNativeQuery() 方法

Query query = manager.createNativeQuery("select * from category_element where farsi_name =: param",CategoryElement.class);  
query.setParameter("param",farsiName);    

但我再次在第 2 行收到了相同的消息 param
我检查这个Link 但它并没有解决我的问题。
我不知道。

编辑:我使用的是 jdk1.8 + tomcat 9 + Hibernate 5.4.27

解决方法

  1. 尝试替换它:
@Entity(name = "CategoryElement ")

这样:

@Entity(name = "CategoryElement")

我建议您完全删除 name 注释中的 @Entity 参数并保留:

@Entity

默认情况下 name 已经等于实体类的非限定名称。

  1. 至于您的 JPQL,我建议您通过以下方式进行更正:
List<CategoryElement> categoryElementList = manager.createQuery(
   "select o from CategoryElement o where o.farsiName = :param",CategoryElement.class
)
.setParameter("param",farsiName)
.getResultList();

这里有几个注意事项:

  • 您应该在 JPQL 中使用实体字段名称,而不是表列名称。

  • 最好避免使用 java raw types。因此,您应该更喜欢使用那些返回 EntityManager.createQuery

    TypedQuery<T> 方法
  1. 对于您的原生查询,您可以通过以下方式进行更正:
List<CategoryElement> categoryElementList = manager.createNativeQuery(
   "select * from category_element where farsi_name = :param",farsiName)
.getResultList();