Hibernate查询异常:在Spring Petclinic示例应用程序中,无法解析属性。

4

我有以下JPA方法:

@SuppressWarnings("unchecked")
public Collection<Owner> findByPetType(Integer typeID) {
    Query query = this.em.createQuery("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets as pet WHERE pet.type_id LIKE :typeID");
    query.setParameter("typeID", typeID + "%");
    return query.getResultList();
}  

它抛出以下错误信息:
org.hibernate.QueryException: could not resolve property: type_id of:  
org.springframework.samples.petclinic.model.Pet [SELECT DISTINCT owner FROM  
org.springframework.samples.petclinic.model.Owner owner left join fetch owner.pets  
as pet WHERE pet.type_id LIKE :typeID];  
nested exception is java.lang.IllegalArgumentException:  
org.hibernate.QueryException: could not resolve property: type_id of:  
org.springframework.samples.petclinic.model.Pet [SELECT DISTINCT owner FROM      
org.springframework.samples.petclinic.model.Owner owner left join fetch owner.pets  
as pet WHERE pet.type_id LIKE :typeID]  

这是来自Spring petclinic示例应用程序的内容,因此所有相关代码都在此链接中(https://github.com/SpringSource/spring-petclinic/),包括数据库定义。我正在使用hsqldb和jpa,上面的findByPetType()方法是我编写的,不在示例应用程序中。
有人能否向我展示如何修复代码,以使其不生成此错误消息?
编辑:
我遵循了Alex的建议,并将pet.type_id更改为pet.type。现在它给我以下错误消息(typeID的值设置为1):
Parameter value [1%] did not match expected type  
[org.springframework.samples.petclinic.model.PetType]; nested exception is  
java.lang.IllegalArgumentException: Parameter value [1%] did not match expected type  
[org.springframework.samples.petclinic.model.PetType]  

第二次编辑:

我采纳了Sergi Almar的建议,但现在出现以下错误:

Parameter value [1%] did not match expected type [java.lang.Integer]; nested exception   
is java.lang.IllegalArgumentException: Parameter value [1%] did not match expected type   
[java.lang.Integer]  

我检查了一下,调用代码将typeID初始化为"Integer typeID = 1;"。所以我不确定为什么这里没有看到一个整数。

2个回答

5

pet.type_id更改为pet.type。您必须在HQL中使用实体的映射属性(而不是列名)。


谢谢你的帮助,加1分。我在原帖中进行了编辑,附上了尝试你的建议后的结果。typeID是一个整数,传递的值为1。你有办法修复由于尝试你的建议而导致的新错误消息吗? - CodeMed

4
由于这是一条JPQL查询语句,因此您应该在查询中使用实体属性(Pet具有一个具有id的PetType)。以下代码将达到您的预期:
@SuppressWarnings("unchecked")
public Collection<Owner> findByPetType(Integer typeID) {
     Query query = this.em.createQuery("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets as pet WHERE pet.type.id = :typeID");
    query.setParameter("typeID", typeID);
    return query.getResultList();
}  

谢谢你的帮助,我给你点赞。我在原始帖子中的第二次编辑中发布了尝试你建议的结果。你能告诉我如何解决新的错误信息吗? - CodeMed
复制我发布的代码,我已经测试过了,它可以正常工作。请注意,您需要在查询中定义id(pet.type.id),而不是类型对象。设置参数时也要删除%符号。 - Sergi Almar
是的,去掉百分号就解决了问题。谢谢。 - CodeMed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接