从 JPA 实体的接口中检索 @NamedQuery

Posted

技术标签:

【中文标题】从 JPA 实体的接口中检索 @NamedQuery【英文标题】:Retrieving @NamedQuery from interface of JPA Entity 【发布时间】:2017-04-26 20:25:34 【问题描述】:

我有一个 JPA 2.1 项目,数据库有 2 个表。我创建了一个接口“UsedClasses.java”并让两个实体都实现了该接口。即

@Entity
@Table(name = "runRanges")
@NamedQuery(name = "RunRange.findAll", query = "SELECT r FROM RunRange r")
public class RunRange extends AbstractTimestampEntity implements UsedClasses, Serializable ....

@Entity
@Table(name = "users")
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
public class User extends AbstractTimestampEntity implements UsedClasses, Serializable ...

我很想知道是否可以使用该界面来获取任一实体的 NamedQuery。 如果根据班级获取结果列表,我想要完成什么。

    public List<UsedClasses> getAllItems() 
    open();
    Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries));

    List<UsedClasses> aList = query.getResultList();
    return aList;

【问题讨论】:

【参考方案1】:

您可以这样做,但您应该使用反射来检索 NamedQuery 注释,并且您需要拥有 UsedClasses 实例,而不是您示例中的接口:

Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries));

此外,如果您添加多个注释,它将不再起作用。

我认为更简单和干净的解决方案是在您的界面中添加一个方法来获取 namedQuery 字符串名称。 例如

public interface UsedClasses()
     String getNamedQueryForGetAll();     

你可以用这种方式实现它:

@Entity
@Table(name = "users")
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
public class User implements UsedClasses()
     public String getNamedQueryForGetAll()            
         return "User.findAll";
     

那你就可以这样使用了:

Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(usedClassInstance.getNamedQueryForGetAll());

现在,我发现它会产生一些重复,并且无法直接阅读。NamedQuery 带来了极其微小的性能提升。 我不确定代码中引入的复杂性/间接级别在执行时间方面获得的收益如此之少是否会让您获胜。

【讨论】:

对你的第一个建议:Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries));这不起作用。错误消息指出 NamedQueries 无法解析为变量。对于您的第二个建议:我不明白如何使用它,因为我没有在创建查询的类中实例化 UsedClasses。如何调用 getNamedQueryForGetAll() 方法? 好的,你在我编辑的时候回答了这个问题。对不起。但是现在我看不出实例是如何知道它接口的类的。

以上是关于从 JPA 实体的接口中检索 @NamedQuery的主要内容,如果未能解决你的问题,请参考以下文章

从其他实体检索ID时的Spring Boot JPA反序列化问题

如何使用Spring数据JPA基于来自另一个实体的列检索实体的数据?

JPA 使用指南 /Eclipselink/JPA 实体生成器

从 JPA/Hibernate 中的视图加载实体

在 JPA 中检索通用实体的主键列定义

如何在运行时检索 JPA 中实体的映射表名称?