2010-05-27 42 views
6

我有一個查詢工廠,它將列名作爲屬性來搜索該列。現在我將該列的名稱作爲字符串傳遞,因此它是一種硬編碼。如果列的名稱在實體的註釋中發生變化,那麼「隱藏的依賴關係」會分解。在jpa中獲取列名稱

有沒有辦法在jpa中檢索列的真實姓名並在編譯時提供它,所以我可以在查詢中使用它?

回答

6

當然,總會有對註釋的反思。假設有典型JPA列定義:

@Basic(optional = true) 
    @Column(name = "MY_COLUMN_NAME_DESC", nullable = true, length = 255) 
    public String getDesc() { 
     return desc; 
    } 

然後具有吸氣劑的方法檢測產率列名的值(例如,從here通過):

Method method = ... //obtain entity object 
Annotation[] annotations = method.getDeclaredAnnotations(); 

for(Annotation annotation : annotations){ 
    if(annotation instanceof Column){ 
     Column myAnnotation = (Column) annotation; 
     System.out.println("name: " + myAnnotation.name()); 
     System.out.println("value: " + myAnnotation.value()); 
    } 
} 

該示例假定方法property access在JPA實體,但沒有什麼能夠阻止你通過對領域進行反思來將其應用於現場級別。

+0

對於愛好者,也可以查看此屬性獲取列名稱(http://stackoverflow.com/a/25520204/1225337) – 2014-08-27 06:30:43

1

這是有點晚了,我知道。 Topchef的回答是正確的,但是如果你想讓它適用於任意實體類,還有其他一些因素需要考慮。我將它們添加以防萬一在網絡搜索中遇到此問題:

  • AttributeOverride類註釋可以覆蓋使用Column註釋指定的列。
  • 如果繼承策略是JOINED,則即使未使用Column註釋指定表,該列也可能駐留在不同的表中。
+0

是否有JPA API獲取屬性的列註釋?合併XML,AttributeOverride,@Column。謝謝。 – eastwater 2015-05-19 14:26:24

+0

@Dave:我沒有意識到我害怕,但我在去年或三年沒有檢查過。我需要在過去做這件事,並且合併你提到的來源。非常討厭,複雜的代碼來重新創建JPA必須做的事情。也許通過Hibernate或EclipseLink直接提供了一種方法... – 2015-05-19 18:32:42

+0

看來他們不提供這樣的公共API。在內部,他們必須有東西來合併來自不同來源的配置。 – eastwater 2015-05-22 15:15:40