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

Retrieving @NamedQuery from interface of JPA Entity

我有一个 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。 如果根据 class.

获取结果列表,我想要完成什么
    public List<UsedClasses> getAllItems() {
    open();
    Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries));

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

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

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

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

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

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 带来了极其微小的性能提升。
我不确定代码中引入的 complexity/indirection 级别在执行时间方面获得如此少的收益是否会让您获胜。