问题描述
@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
解决方法
- 尝试替换它:
@Entity(name = "CategoryElement ")
这样:
@Entity(name = "CategoryElement")
我建议您完全删除 name
注释中的 @Entity
参数并保留:
@Entity
默认情况下 name
已经等于实体类的非限定名称。
- 至于您的 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>
方法
- 对于您的原生查询,您可以通过以下方式进行更正:
List<CategoryElement> categoryElementList = manager.createNativeQuery(
"select * from category_element where farsi_name = :param",farsiName)
.getResultList();