簡體   English   中英

DataNucleus Enhancer,JDO和指定列名稱

[英]DataNucleus Enhancer, JDO and Specifying Column Names

我正在使用DataNucleus作為Google App Engine項目的一部分,但是在持久性方面存在一些麻煩。

@PrimaryKey(column = "user_id")
@Column(name = "user_id")
@Persistent(name = "user_id", column = "user_id", valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key m_id;

@Column(name = "user_name")
@Persistent(name = "user_name", column = "user_name")
private String m_userName;

如果您不知道,我試圖用不同於變量名稱的名稱來命名該列,因為我有兩種命名約定(一種在Java中更好,另一種在SQL中更好)。 無論如何,我已經嘗試了所有這些標記注釋的變體,但是DataNucleus增強器拒絕兌現它們中的任何一個,因此當我運行如下查詢時:

Query q = pm.newQuery(User.class,
                      "user_name == _username");

我總是收到這樣的錯誤:

org.datanucleus.store.appengine.FatalNucleusUserException:解析查詢時出現意外的表達式類型。 您確定對象上存在一個名為user_name的字段嗎?

當然,當運行這樣的查詢時:

Query q = pm.newQuery(User.class,
                      "m_userName == _username");

...一切都很好。 因此,如果這些注釋中的任何一個得到了user_name ,都會有一個名為user_name的字段,但顯然不是。

所以我的問題是:有什么方法可以將查詢中使用的令牌與字段名稱分離? 我正在尋找無需手動編輯查詢即可更改字段名稱的功能。

注意:我將很快在Java類中使用我的SQL命名約定,而不是手工編寫大量的XML,因此必須使用批注來完成。

不知道SQL的話題,您使用的是GAE / J,因此使用的是BigTable,而不是RDBMS,因此SQL無法使用。 @Column可能不執行任何操作,因為它適用於ORM。 在這里,您使用的是JDOQLas查詢語言,因此您使用字段名...,因為它是一種面向對象的查詢語言。 這不是SQL。 您討厭“這個”嗎? JDOQL使用Java語法,因此“ this”很有意義。

如果您確實想要具有允許重構的類型安全的查詢擴展,則QueryDSL提供JDOQL以便與DataNucleus一起使用。

PS DataNucleus增強器與列名無關。 根據JDO規范,它只是添加了用於檢測字段更新的其他方法。

不能100%確定我能解決您的問題。 如果在查詢中使用m_userName ,在SQL查詢中是否將其轉換為user_name

您根據Java類名稱和變量表示查詢,然后根據SQL模式表和列名稱將它們轉換為可工作的名稱。 這是大多數時候人們想要的。

BTW, m_idm_userName是Java代碼的可怕命名約定。 我強烈建議您遵循通常的慣例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM