2017-04-26 73 views
1

我有一個JPA 2.1項目,數據庫有2個表。我已經創建了一個接口「UsedClasses.java」,並有兩個實體實現的接口,即從JPA實體接口獲取@NamedQuery

@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帶來了極小的性能提升。
我不確定代碼中引入的複雜性/間接性級別在執行時間方面獲得如此少的優勢會使您獲勝。

+0

對您的第一個建議: 查詢查詢= EntityManagerHandler.INSTANCE.getEntityManager()。createQuery(UsedClasses.class.getResource(NamedQueries)); 這不起作用。錯誤消息狀態 NamedQueries無法解析爲變量。 對你的第二個建議: 我不明白如何使用它,因爲我沒有在創建查詢的類中實例化UsedClasses。我如何調用方法getNamedQueryForGetAll()? – mkunkel

+0

好的,您在編輯時回答了問題。抱歉。但是現在我沒有看到實例如何知道它與哪個類接口。 – mkunkel