You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Quarkus MongoDB Panache中实现DBRef到Java POJO的映射与查询?

实体类定义与查询示例

1. User 实体类

先定义与User集合对应的实体,注意匹配集合中字符串类型的id字段:

import io.quarkus.mongodb.panache.PanacheMongoEntityBase;
import io.quarkus.mongodb.panache.common.MongoEntity;

@MongoEntity(collection = "user")
public class User extends PanacheMongoEntityBase {
    public String id;
    public String login;
    public String password;
}

2. Profile 实体类

在Profile实体中,用@DBRef注解映射MongoDB的DBRef关联字段,指定关联的User实体:

import io.quarkus.mongodb.panache.PanacheMongoEntityBase;
import io.quarkus.mongodb.panache.common.DBRef;
import io.quarkus.mongodb.panache.common.MongoEntity;

@MongoEntity(collection = "profile")
public class Profile extends PanacheMongoEntityBase {
    public String profile_name;
    @DBRef(collection = "user")
    public User user;
    public String created_by;
    public String created_date;
}

3. 查询Profile的示例代码

方式一:Panache简化查询

直接利用Panache的查询语法关联用户ID:

import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class ProfileRepository {
    public Profile findByUserId(String userId) {
        return Profile.find("user.id", userId).firstResult();
    }
}

方式二:MongoClient原生查询

用原生Document构造查询条件,自动映射到实体:

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import com.mongodb.client.MongoCollection;
import org.bson.Document;

@ApplicationScoped
public class ProfileRepository {
    @Inject
    MongoCollection<Profile> profileCollection;

    public Profile findByUserId(String userId) {
        Document query = new Document("user.$id", userId);
        return profileCollection.find(query).first();
    }
}

关键注意事项

  • 确保User实体的id类型与集合一致:你的User集合用字符串id,实体中不要用ObjectId类型,否则映射会失败。
  • @DBRef注解的collection参数,若与User实体@MongoEntity指定的集合名一致,可省略。
  • 原生查询时,user.$id的取值是字符串格式的用户ID,不要转成ObjectId类型。

内容的提问来源于stack exchange,提问作者Vijaykumar Ponnusamy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:12:40