首页 > 解决方案 > 如何使用 jOOQ fetchInto() 映射到现有的 Hibernate 模型?

问题描述

我正在尝试使用 jOOQfetchInto()方法映射到现有的 Hibernate 模型Organization(类及其继承如下)。

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

我遇到的问题是我无法真正理解DefaultRecordMapper中发生了什么,因为我觉得我并不完全熟悉所使用的所有术语。我试图弄清楚它如何应用于我的代码库中的 Hibernate 类。

到目前为止,我已经尝试过:

什么有效:

什么不起作用:

我的问题是:映射有什么我忽略的东西吗?关于 Hibernate 模型的类、字段、构造函数和注释,我应该注意什么?我想最终映射代码库中的所有 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();
    }
}

标签: javahibernateplayframeworkjooq

解决方案


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

但是jOOQ 永远不会支持@MappedSuperclass@Type不太可能支持类似的东西。

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

您已决定使用 jOOQ 创建和运行查询。我想您的实际查询比您显示的要复杂得多,因为对于该特定查询,您不需要 jOOQ。

你真的需要映射到 Hibernate 实体吗?因为即使您使用 Hibernate,推荐的方法是在您要修改实体并将增量存储回数据库时才使用实体。如果是这种情况,请参阅下面的步骤 2。如果不是这样,为什么不使用 jOOQ 自己的映射功能来处理任何支持 jOOQ 的 POJO 样式?

第 2 步:使用 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();
}

推荐阅读