Hibernate createNativeQuery()&;使用NamedParameter创建查询()

Hibernate createNativeQuery()&;使用NamedParameter创建查询(),hibernate,prepared-statement,jpql,Hibernate,Prepared Statement,Jpql,我有一个实体CategoryElement: @Entity(name = "CategoryElement ") @Table(name = "category_element") public class CategoryElement { @Column(columnDefinition = "varchar(100)", name = "farsi_name",nullable = false) pr

我有一个实体
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
中所做的相同的查询,但我得到了一个语法错误
无法解析符号

我的问题是:

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;
}
但是我在第2行中再次得到了
param

的相同消息 我检查一下这个 但这并不能解决我的问题。
我不知道

编辑:我正在使用jdk1.8+Tomcat9+Hibernate5.4.27

  • 尝试替换此选项:
  • @Entity(name=“CategoryElement”)
    
    据此:

    @Entity(name=“CategoryElement”)
    
    我建议您完全删除
    @Entity
    注释中的
    name
    参数,只留下:

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

  • 至于您的JPQL,我建议您按照以下方式进行更正:
  • List categoryElementList=manager.createQuery(
    “从CategoryElement o中选择o,其中o.farsiName=:param”,
    类别
    )
    .setParameter(“参数”,farsiName)
    .getResultList();
    
    这里有几个注意事项:

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

    • 最好避免使用。因此,您应该更喜欢使用那些返回
      TypedQuery

  • 对于本机查询,您可以通过以下方式进行更正:
  • List categoryElementList=manager.createNativeQuery(
    “从类别元素中选择*,其中波斯语名称=:param”,
    类别
    )
    .setParameter(“参数”,farsiName)
    .getResultList();
    
    按照您建议的JPQL格式的第一种方式,我在
    .setParameter(“param”,farsiName)
    中得到了
    'param'
    的语法错误;在第二种情况下,我在这一行遇到了与CategoryElement相同的问题:
    “从CategoryElement o中选择o,其中o.farsiName=:param”
    ,尽管我更改了您在entity类中提到的内容。最后我用位置参数找到了答案@Sternk您得到的确切语法错误是什么?请显示完整堆栈跟踪。哦,我又犯了一个错误。。。你的解决方案很好,非常感谢。
    Query query = manager.createNativeQuery("select * from category_element where farsi_name =: param", CategoryElement.class);  
    query.setParameter("param",farsiName);