Прежде всего, я работаю со старым драйвером Монго (1.5.6) и не могу его обновить. Кроме того, мы сталкиваемся с серьезными проблемами производительности при использовании MongoTemplate
, поэтому мы решили не использовать его. Вместо этого мы перебираем DBCollection
public class CustomMongoTemplate {
private final DBCollection collection;
private DBToEntityTranslator dbToEntityTranslator = new DBToEntityTranslator();
public CustomMongoTemplate(MongoConfig mongoConfiguration) {
collection = mongoConfiguration.getCollection();
}
public List<MyEntity> find(Query query) {
return convert(doFind(query));
}
private DBCursor doFind(Query query) {
return collection.find(query.getQueryObject());
}
private List<MyEntity> convert(DBCursor cursor) {
List<MyEntity> entities = new ArrayList<>();
while (cursor.hasNext()) {
entities .add(dbToEntityTranslator.toEntity((cursor.next())));
}
return entities ;
}
}
А вот мой класс конфигурации.
@Configuration
public class MongoConfig extends AbstractMongoConfiguration {
private DBCollection collection;
@PostConstruct
private void init() throws Exception {
DB db = mongo().getDB(dbName);
collection = db.getCollection("mycollection");
}
@Override
protected String getDatabaseName() {
return dbName;
}
@Override
public Mongo mongo() throws Exception {
CodecProvider pojoCodecProvider = PojoCodecProvider.builder().register("com.company.entities").build();
CodecRegistry pojoCodecRegistry = fromRegistries(MongoClient.getDefaultCodecRegistry(), fromProviders(pojoCodecProvider));
MongoClientOptions mongoClientOptions = MongoClientOptions.builder().codecRegistry(pojoCodecRegistry).build();
return new MongoClient(Collections.singletonList(new ServerAddress(host, port)),
Collections.singletonList(MongoCredential.createMongoCRCredential(userName, dbName, password.toCharArray())),
mongoClientOptions);
}
Как видите, я пытаюсь зарегистрировать свои классы сущностей в CodecRegistry
, поэтому я могу использовать Criteria
, который выглядит следующим образом
criteria.add((Criteria.where("root.myEntity").exists(true).all(myEntity)));
Где myEntity
- мой объект класса com.company.entities.MyEntity
, который должен быть зарегистрирован. Однако, когда я пытаюсь запустить это, я получаю
"Не удается найти кодек для класса com.company.entities.MyEntity."