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

Java 从JPA实体的接口检索@NamedQuery,java,jpa-2.1,Java,Jpa 2.1,我有一个JPA2.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,

我有一个JPA2.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 ....

我很想知道我是否可以使用该接口获取任何一个实体的NamedQuery。 如果我按照课堂要求得到结果列表,我将努力完成什么

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

    List<UsedClasses> aList = query.getResultList();
    return aList;
}
公共列表getAllItems(){
open();
Query Query=EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries));
List aList=query.getResultList();
回归主义者;
}

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

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());
然后您可以这样使用它:

@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));这是行不通的。无法将错误消息states namedquerys解析为变量。对于您的第二个建议:我不明白如何使用它,因为我没有在创建查询的类中实例化UsedClass。如何调用getNamedQueryForGetAll()方法?好的,您在我编辑时回答了这个问题。很抱歉但现在我看不出实例如何知道它与哪个类接口。