如何使用 jOOQ fetchInto() 映射到现有的 Hibernate 模型?
How to map to an existing Hibernate model using jOOQ fetchInto()?
我正在尝试使用 jOOQ fetchInto()
方法映射到现有的 Hibernate 模型 Organization
(class 及其继承如下)。
Organization organization = jooq().select().from(ORGANIZATION).fetchOne().into(Organization.class);
我遇到的问题是我无法真正理解 DefaultRecordMapper 中发生的事情,因为我觉得我并不完全熟悉所使用的所有术语。我试图弄清楚它如何应用于我的代码库中的 Hibernate classes。
到目前为止我已经尝试过:
- 使用 jOOQ 生成的 POJO 查看它是否完全检索和映射数据(有效)。
- 向
Organization
Hibernate 模型添加构造函数、getter 和 setter。
- 在
Organization
Hibernate 模型中向 name
添加 @Column
注释。
什么有效:
id
字段已正确映射。
什么不起作用:
name
字段未映射 (null
)。
createdAt
和 modifiedAt
字段未映射 (null
)。
我的问题是:我是否忽略了映射的某些内容?关于 Hibernate 模型的 classes、字段、构造函数和注释,我应该注意哪些内容?我想最终映射代码库中的所有 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 创建并 运行 您的查询。我想你的 actual 查询比你显示的要复杂得多,因为对于那个特定的查询,你不需要 jOOQ。
您真的需要映射到 Hibernate 实体吗?因为即使您使用 Hibernate,推荐的方法是在您要修改它们并将增量存储回数据库时仅使用实体 。如果是这种情况,请参阅下面的步骤 2。如果不是这样,为什么不使用 jOOQ 自己的映射功能来处理 jOOQ 支持的任何样式的 POJO?
第 2 步:使用 Hibernate 执行 jOOQ 查询
如果您使用 jOOQ 只是为了构建一个相当复杂的 SQL 查询,并且您 需要 Hibernate 实体,那么 use Hibernate to execute the jOOQ query as documented here。一个小实用程序就足够了:
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();
}
我正在尝试使用 jOOQ fetchInto()
方法映射到现有的 Hibernate 模型 Organization
(class 及其继承如下)。
Organization organization = jooq().select().from(ORGANIZATION).fetchOne().into(Organization.class);
我遇到的问题是我无法真正理解 DefaultRecordMapper 中发生的事情,因为我觉得我并不完全熟悉所使用的所有术语。我试图弄清楚它如何应用于我的代码库中的 Hibernate classes。
到目前为止我已经尝试过:
- 使用 jOOQ 生成的 POJO 查看它是否完全检索和映射数据(有效)。
- 向
Organization
Hibernate 模型添加构造函数、getter 和 setter。 - 在
Organization
Hibernate 模型中向name
添加@Column
注释。
什么有效:
id
字段已正确映射。
什么不起作用:
name
字段未映射 (null
)。createdAt
和modifiedAt
字段未映射 (null
)。
我的问题是:我是否忽略了映射的某些内容?关于 Hibernate 模型的 classes、字段、构造函数和注释,我应该注意哪些内容?我想最终映射代码库中的所有 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 创建并 运行 您的查询。我想你的 actual 查询比你显示的要复杂得多,因为对于那个特定的查询,你不需要 jOOQ。
您真的需要映射到 Hibernate 实体吗?因为即使您使用 Hibernate,推荐的方法是在您要修改它们并将增量存储回数据库时仅使用实体 。如果是这种情况,请参阅下面的步骤 2。如果不是这样,为什么不使用 jOOQ 自己的映射功能来处理 jOOQ 支持的任何样式的 POJO?
第 2 步:使用 Hibernate 执行 jOOQ 查询
如果您使用 jOOQ 只是为了构建一个相当复杂的 SQL 查询,并且您 需要 Hibernate 实体,那么 use Hibernate to execute the jOOQ query as documented here。一个小实用程序就足够了:
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();
}