我有一個查詢工廠,它將列名作爲屬性來搜索該列。現在我將該列的名稱作爲字符串傳遞,因此它是一種硬編碼。如果列的名稱在實體的註釋中發生變化,那麼「隱藏的依賴關係」會分解。在jpa中獲取列名稱
有沒有辦法在jpa中檢索列的真實姓名並在編譯時提供它,所以我可以在查詢中使用它?
我有一個查詢工廠,它將列名作爲屬性來搜索該列。現在我將該列的名稱作爲字符串傳遞,因此它是一種硬編碼。如果列的名稱在實體的註釋中發生變化,那麼「隱藏的依賴關係」會分解。在jpa中獲取列名稱
有沒有辦法在jpa中檢索列的真實姓名並在編譯時提供它,所以我可以在查詢中使用它?
當然,總會有對註釋的反思。假設有典型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實體,但沒有什麼能夠阻止你通過對領域進行反思來將其應用於現場級別。
這是有點晚了,我知道。 Topchef的回答是正確的,但是如果你想讓它適用於任意實體類,還有其他一些因素需要考慮。我將它們添加以防萬一在網絡搜索中遇到此問題:
是否有JPA API獲取屬性的列註釋?合併XML,AttributeOverride,@Column。謝謝。 – eastwater 2015-05-19 14:26:24
@Dave:我沒有意識到我害怕,但我在去年或三年沒有檢查過。我需要在過去做這件事,並且合併你提到的來源。非常討厭,複雜的代碼來重新創建JPA必須做的事情。也許通過Hibernate或EclipseLink直接提供了一種方法... – 2015-05-19 18:32:42
看來他們不提供這樣的公共API。在內部,他們必須有東西來合併來自不同來源的配置。 – eastwater 2015-05-22 15:15:40
對於愛好者,也可以查看此屬性獲取列名稱(http://stackoverflow.com/a/25520204/1225337) – 2014-08-27 06:30:43