JPA Query 通过 id 以外的参数查找

Posted

技术标签:

【中文标题】JPA Query 通过 id 以外的参数查找【英文标题】:JPA Query find by parameter other than id 【发布时间】:2012-11-12 15:51:12 【问题描述】:

我有一个 mysql 数据库,其中包含一个名为 User 的表。它有两列。一个名为ID,另一个名为EMAIL。它有更多的列,但这与问题无关。

在我的 DAO 对象中,我想创建一个名为 findByEmail 的方法。目前看起来是这样的:

@Override
public User findByEmail(String email) 
    Object obj = em.createQuery("FROM User WHERE EMAIL LIKE :email").setParameter("email", email).getSingleResult();
    User user = (User)obj;
    return user;        

这给出了一个空指针异常。我的猜测是,我的查询是错误的。谁能帮我解决这个问题?

【问题讨论】:

通常 JPA 查询会像“select r FROM User r WHERE r.EMAIL = :email”,因为您不能在电子邮件中输入类似 这是无效的 JPQL(检查“SELECT”部分的规范)。显然,您可能正在使用一些(Hibernate)特定于实现的,但是如果您是,那么在任何问题中都应该提到这一点 【参考方案1】:

显然,MySQL 服务器被配置为阻止所有远程连接。它现在可以工作了(使用 vels4j 提供的 JPA 查询,select r FROM User r WHERE r.EMAIL = :email

【讨论】:

【参考方案2】:

正如你所说,你可以这样做。但是如果你想遵循更接近的 SQL 方法,你不妨使用

    @Override
public User findByEmail(String email) 
    Object obj = em.createNativeQuery("SELECT * FROM User WHERE EMAIL = " + email).getSingleResult();
    User user = (User)obj;
    return user;        

此外,如果您想缩短代码,您可以在执行查询的同一行中声明和强制转换用户,如下所示:

User user = (User) em.createNativeQuery("SELECT * FROM User WHERE EMAIL = " + email).getSingleResult();

希望对您有所帮助!

【讨论】:

以上是关于JPA Query 通过 id 以外的参数查找的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 Spring Data JPA 参数绑定

获取地址中的query参数,完美版

spring-data-jpa 的@Query注解的使用

JPA查找实体

在 jpa play 框架中按字段查找

Spring Data JPA 通过嵌入对象属性查找