簡體   English   中英

如何使用 jOOQ fetchInto() 將 map 轉換為現有的 Hibernate model?

[英]How to map to an existing Hibernate model using jOOQ fetchInto()?

我正在嘗試使用 jOOQ fetchInto()方法將 map 用於現有的 Hibernate model Organization (類及其繼承如下)。

Organization organization = jooq().select().from(ORGANIZATION).fetchOne().into(Organization.class);

我遇到的問題是我無法真正理解DefaultRecordMapper中發生了什么,因為我覺得我並不完全熟悉所使用的所有術語。 我試圖弄清楚它如何應用於我的代碼庫中的 Hibernate 類。

到目前為止,我已經嘗試過:

  • 使用 jOOQ 生成的 POJO 來查看它是否完全檢索和映射數據(有效)。
  • 將構造函數、getter 和 setter 添加到Organization Hibernate model。
  • Organization Hibernate model 的name中添加@Column注釋。

什么有效:

  • id字段被正確映射。

什么不起作用:

  • name字段未映射( null )。
  • createdAtmodifiedAt字段沒有被映射( null )。

我的問題是:在映射中我是否忽略了一些東西?關於 Hibernate 模型的類、字段、構造函數和注釋我應該注意什么? 我想最終 map 代碼庫中的所有 Hibernate 模型並使用fetchInto來做到這一點。

謝謝: :)

@Entity
public class Organization extends BaseModel {
  @Required public String name;

  //... a lot of other code
}
@MappedSuperclass
public class BaseModel extends Model {
  /** The datetime this entity was first saved. Automatically set by a JPA prePersist */
  @NoBinding
  @Column
  @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
  public DateTime createdAt;

  /** The datetime this entity was last modified. Automatically set by a JPA preUpdate */
  @NoBinding
  @Column
  @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
  public DateTime modifiedAt;

  //...
}
@MappedSuperclass
public class Model extends GenericModel { // Both Model and GenericModel are from the Play Framework
    @Id
    @GeneratedValue
    public Long id;

    public Model() {
    }

    public Long getId() {
        return this.id;
    }

    public Object _key() {
        return this.getId();
    }
}

jOOQ 不支持所有許多 JPA 和 Hibernate 特定注釋。 從歷史上看,它支持一些 JPA 注釋(因為為什么不支持),但是完整的互操作會過多並且將產品開發時間投入錯誤的地方。 jOOQ 絕不是 JPA 實現。

第 0 步:為什么(某些)映射不起作用?

如前所述,並非所有 JPA 規范都已實現。 例如,一個已知問題是@Column注釋在 jOOQ 中仍然是強制性的: https://github.com/jOOQ/jOOQ/issues/4586

可能還有其他此類限制,這可能被視為錯誤。 如果您想繼續這條路,請隨時報告他們: https://github.com/jOOQ/jOOQ/issues/new/choose

但是像@MappedSuperclass@Type這樣的東西不太可能被jOOQ 支持。

第 1 步:你真的需要它嗎?

您已決定使用 jOOQ 創建和運行查詢。 我想您的實際查詢比您顯示的要復雜得多,因為對於該特定查詢,您不需要 jOOQ。

你真的需要map 到 Hibernate 實體嗎? 因為即使您使用 Hibernate,推薦的方法是在您要修改實體並將增量存儲回數據庫時才使用實體。 如果是這種情況,請參閱下面的步驟 2。 如果不是這樣,為什么不使用 jOOQ 自己的映射功能來處理任何支持 jOOQ 的 POJO 樣式?

第二步:使用 Hibernate 執行 jOOQ 查詢

如果您僅使用 jOOQ 構建一個相當復雜的 SQL 查詢,並且您需要Hibernate 實體,那么使用 Hibernate 執行 jOOQ 查詢,如記錄在此一個小實用程序就足夠了:

public static <E> List<E> nativeQuery(EntityManager em, org.jooq.Query query, Class<E> type) {
    Query result = em.createNativeQuery(query.getSQL(), type);

    List<Object> values = query.getBindValues();
    for (int i = 0; i < values.size(); i++)
        result.setParameter(i + 1, values.get(i));

    return result.getResultList();
}

暫無
暫無

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

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