javax.persistence.PersistenceException:org.hibernate.exception.genericjdbception:无法执行查询

javax.persistence.PersistenceException:org.hibernate.exception.genericjdbception:无法执行查询,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,嗨,我已经在这些论坛上对此进行了彻底的研究,很多人都发布了一些东西,但这些都对我没有帮助 我的目标: @Entity @Table(name = "ADDRESS") @NamedQuery(name = "Address.findByRegistrationId", query = "SELECT a FROM Address a WHERE a.registration_id = :registration_id") public class Address { @Id @Column(n

嗨,我已经在这些论坛上对此进行了彻底的研究,很多人都发布了一些东西,但这些都对我没有帮助

我的目标:

@Entity
@Table(name = "ADDRESS")
@NamedQuery(name = "Address.findByRegistrationId", query = "SELECT a FROM Address a WHERE a.registration_id = :registration_id")
public class Address {

@Id
@Column(name = "ADDRESS_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private long address_id;

@Column(name = "REGISTRATION_ID")
private long registration_id;

public long getRegistration_id() {
    return registration_id;
}

public void setRegistration_id(long registration_id) {
    this.registration_id = registration_id;
}
我的存储库实现:

@Repository
public class AddressRepositoryJpa implements AddressRepository {
private final Logger log = Logger.getLogger(AddressRepositoryJpa.class.getName());

@PersistenceContext
private EntityManager entityManager;

@Override
public Address findByID(int id) {
    return entityManager.find(Address.class, id);
}

@Override
public Address findByRegistrationID(Long registration_id) {
    TypedQuery<Address> query = (TypedQuery<Address>) entityManager.createNamedQuery("Address.findByRegistrationId", Address.class);
    query.setParameter("registration_id", registration_id);
    Address address = (Address) query.getSingleResult();
    return address;
}

也许这只是一个不合适的外壳问题:)

命名参数区分大小写,可由动态和静态查询使用

您可以使用此API轻松地进行测试
javax.persistence.Query#setParameter(int,java.lang.Object)
如下:

Query query = entityManager.createNamedQuery("find address by registration_id");
query.setParameter(1, registration_id);
Address address = (Address) query.getSingleResult();
return address;

尝试按以下方式命名查询:

@NamedQuery(name = "Address.findByRegistrationId")...

我发现了问题所在,在我的实体中有另一个名为“student_id”的字段,该字段在实体中定义为int,但在数据库中是varchar

因此,给出的错误与我关注的领域无关:“注册id”,而是与另一个领域有关


谢谢大家的回答。

变量类型有问题,你能试着用地址id而不是注册id来搜索吗。让我知道。嗨,博格,很遗憾,我的值是注册id,但很长,所以你可能有一个观点,但不确定如何处理。另外,请从您共享的配置中删除jdbc数据源url,这应被视为敏感信息;)我试过了,但是运气不好,这是一个很好的建议,这样看起来更好,谢谢。你是如何给注册号的,你用的是long吗?为了澄清,您的实体类中有getter/setter,对吗?我已经尝试过了,谢谢,但是我遇到了同样的问题,我正在阅读异常,也许这与我使用实体中定义的参数的时间长有关?我将发布上面的堆栈跟踪部分,以便您了解我的意思。如果我尝试一种不同于命名查询的方法,你会推荐什么?你能在这个方法的If子句上添加一个断点吗
org.hibernate.loader.hql.QueryLoader#checkQuery
,它是
org.hibernate.loader.hql.QueryLoader:500
?查看这两个条件中的哪一个触发了
org.hibernate.QueryException
?也许您应该使用
javax.persistence.EntityManager#createNamedQuery(java.lang.String,java.lang.Class)
并更新您的代码,使其了解您期望的查询结果的类型,如下所示
TypedQuery query=entityManager.createNamedQuery(“按注册id查找地址”,address.class)。由于
javax.persistence.TypedQuery
接口扩展了您正在针对
javax.persistence.query
编程查询的接口,其余的代码应该可以编译…嗨,Filip,sql在stacktrace的开头就已经可见了,我已经抓取了sql语句并在我的sqldeveloper中运行了它,它工作得很好,请记住,我还使用entitymanager.find方法进行了其他数据库检索,因此与数据库的连接很好。我相信问题在于hibernate中的某些配置不允许我运行namedqueries,也许您可以指出我的persistence.xml中的一个错误?Hi Filip,不是因为我在实体中有另一个名为“student_id”的字段定义为int,但在数据库中它是varchar!
Query query = entityManager.createNamedQuery("find address by registration_id");
query.setParameter(1, registration_id);
Address address = (Address) query.getSingleResult();
return address;
@NamedQuery(name = "Address.findByRegistrationId")...