如何在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
相关产品推荐
相关产品推荐

