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

JPA:如何根据字段值而不是ID获取实体?

龙玄天
2023-03-14

在JPA(Hibernate)中,当我们自动生成ID字段时,假设用户不知道这个密钥。因此,在获取实体时,用户将基于ID以外的某些字段进行查询。在这种情况下,我们如何获取实体(因为em.find()无法使用)。

我知道我们可以稍后使用查询并过滤结果。但是,有没有更直接的方法(因为这是我所理解的一个非常普遍的问题)。

共有3个答案

刘选
2023-03-14

基本上,您应该添加一个特定的唯一字段。我通常使用xxxUri字段。

class User {

    @Id
    // automatically generated
    private Long id;

    // globally unique id
    @Column(name = "SCN", nullable = false, unique = true)
    private String scn;
}

你的商业方法就是这样。

java prettyprint-override">public User findUserByScn(@NotNull final String scn) {
    CriteriaBuilder builder = manager.getCriteriaBuilder();
    CriteriaQuery<User> criteria = builder.createQuery(User.class);
    Root<User> from = criteria.from(User.class);
    criteria.select(from);
    criteria.where(builder.equal(from.get(User_.scn), scn));
    TypedQuery<User> typed = manager.createQuery(criteria);
    try {
        return typed.getSingleResult();
    } catch (final NoResultException nre) {
        return null;
    }
}
漆雕安晏
2023-03-14

如果您有实体Foo的存储库,并且需要选择具有精确字符串值boo的所有条目(也适用于其他基本类型或实体类型)。将其放入存储库界面:

List<Foo> findByBoo(String boo);

如果您需要订购结果:

List<Foo> findByBooOrderById(String boo);

详见参考资料。

岑叶秋
2023-03-14

这不是你所说的“问题”。

Hibernate有内置的find(),但是为了获得特定的对象,您必须构建自己的查询。我建议使用Hibernate的标准

Criteria criteria = session.createCriteria(YourClass.class);
YourObject yourObject = criteria.add(Restrictions.eq("yourField", yourFieldValue))
                             .uniqueResult();

这将在当前类上创建一个标准,添加“yourField”列等于yourField值的限制uniqueResult()告诉它带来唯一的结果。如果有更多对象匹配,则应检索列表。

List<YourObject> list = criteria.add(Restrictions.eq("yourField", yourFieldValue)).list();

如果您还有任何问题,请随时提问。希望这有帮助。

 类似资料:
  • 我需要获取包含该字段的C节点(名称=p,值=4) 如何在不使用索引的情况下获得这个?

  • 我有以下数据帧: 我希望获得行ID,其中。 预期收益为。 有什么想法吗?

  • 我试图根据选项值返回值。我的目标是返回。right()如果选项不存在,则代码应返回其中一个。左()。我使用Java 8和vavr 0.9.2 我想避免条件叠加 编译器失败并显示此消息

  • 问题内容: 有谁知道我该如何在hibernate状态下做到这一点: 使用JPA? EntityManager有一个contains方法,但仅此而已! 我正在编写一些代码,充当实体和会话中存储的数据之间的转换器(因此,不是存储序列化的对象,而是仅存储类名和ID)。 问题答案: 有谁知道我可以用JPA在hibernate(…)中做到这一点? JPA 1.0没有等效的功能,因此如果您坚持使用JPA 1.

  • 我用lombook注释了实体类(https://projectlombok.org/features/all): 我有使用这个实体从数据库中给我数据的服务。最后我尝试从会员对象中获取一些数据 但我在成员对象中没有任何getter。当我写我有错误(IDEA建议我创建getter'getName()')。如何将lombook与jpa实体一起使用?如何访问用lombok注释(如@Getter或@Sett

  • 下面是我的搜索响应示例,检索到4个结果。 现在,我想根据下面的标准,根据特定的“dir”字段值过滤上述搜索结果。 在且仅在以下情况下将搜索结果包含在响应中: 如果“dir”字段值等于“/shared”或“/private/hitesh” 如果“dir”字段值以“/shared/”或“/private/hitesh/”开头,则为其他 如何在ElasticSearch中实现上述功能?