当前位置: 首页 > 知识库问答 >
问题:

如何使用jOOQ fetchInto()映射到现有的Hibernate模型?

方浩旷
2023-03-14

我试图使用jOOQfetchInto()方法映射到现有的Hibernate模型组织(类及其继承如下)。

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

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

到目前为止,我所尝试的是:

  • 使用jOOQ生成的POJO来查看它是否检索并映射了数据(有效)

工作原理:

  • 正确映射id字段

什么不起作用:

  • name字段没有被映射(null)。
  • createdAt修改At字段不会被映射(null)。

我的问题是:映射有什么我忽略的地方吗?关于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();
    }
}

共有1个答案

羊舌迪
2023-03-14

jOOQ不支持所有JPA和Hibernate特定的注释。从历史上看,它支持一些JPA注释(因为为什么不支持),但完全互操作将是过度的,并且将产品开发时间投入到错误的地方。jOOQ决不是JPA实现。

如前所述,并非所有JPA规范都已实现。例如,一个已知的问题是,jOOQ中的注释仍然是必需的:https://github.com/jOOQ/jOOQ/issues/4586

可能还有其他此类限制,这些限制可能被视为bug。如果你想继续走这条路,请随时报告:https://github.com/jOOQ/jOOQ/issues/new/choose

但是像MappedSuperclass或Type之类的东西不太可能被jOOQ支持。

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

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

如果您使用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();
}
 类似资料:
  • 我正在尝试在OneToOne映射中加入Hibernate实体。我能够从Main Entity获取给定主键的数据,但是加入实体返回null。我是Hibernate新手,任何帮助都将不胜感激。 我有两张桌子, PT\U核心 主键:ptId—整数 ST_AUX 主键:stId; 列:stId, stName 这两个表由其他应用程序填充,而我的是只读操作。 下面是我的第一个实体类(PtCore.java)

  • 问题内容: 我有一个颜色枚举 我有包含它的MyEntity。 我已经有一个UserType来映射我的枚举。 您知道如何在Hibernate hbm.xml中映射枚举集吗? 我需要UserType还是最简单的方法? 谢谢 编辑: 只是为了说明一下,我正在寻找 hbm.xml 配置而不是@CollectionOfElements注释 问题答案: 我使用EnumSet映射线程中的解决方案,该解决方案依赖

  • 问题内容: 在此代码中,如何为组合键生成Java类(如何在hibernate状态下组合键): 问题答案: 要映射组合键,你可以使用EmbeddedId 或在IdClass注解。我知道这个问题不仅仅涉及JPA,但规范定义的规则也适用。因此,它们是: 2.1.4主键和实体身份 … 组合主键必须对应于单个持久性字段或属性,或对应于如下所述的一组此类字段或属性。必须定义一个主键类来表示一个复合主键。当数据

  • 我正在使用Hibernate和JPA注释来映射我的类。当hibernate尝试映射这个类时,我遇到了一个问题 我的Social alStat类是: 我得到了这个错误: 我猜发生这种情况是因为我试图映射到一个基本类,但@ElementCollection注释不应该解决这个问题吗? 我的item类如下所示:

  • 我创建了一个使用Hibernate进行持久化的应用程序,我尝试映射映射,但遇到了一些错误:“IllegalArgumentException”和“完整性约束冲突:外键无操作” 映射文件为: 该类拥有一个绑定列表: 和他的映射: 错误日志: 提前感谢您的回答

  • 我试图使用http://modelmapper.org/表示DAO和模型类的库- 模型类- 道类- 公共类主题{私有字符串名称; 映射逻辑 ModelMapper似乎不起作用,它给我提供了主题类项目,而不是主题模型类项目