从JPA Entity的接口检索@NamedQuery

时间:2017-04-26 20:25:35

标签: java jpa-2.1

我有一个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 个答案:

答案 0 :(得分:1)

你可以这样做但你应该使用反射来检索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带来极小的性能提升 我不确定代码中引入的复杂性/间接级别在执行时间方面获得如此少的优势会让你获胜。