createNativeQuery()& createQuery() with NamedParameter

createNativeQuery()& createQuery() with 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")

我建议您完全删除 @Entity 注释中的 name 参数,只留下:

@Entity

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

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

这里还有几个注意事项:

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

  • 最好避免使用java raw types。因此,您应该更喜欢使用 return TypedQuery<T>

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