Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Springboot With Mongodb Error while using find*() query

I am getting the following error:

at com.aks.springStorage.SpringStorageApplication.main(SpringStorageApplication.java:22) [classes/:na]
Caused by: org.springframework.data.mongodb.UncategorizedMongoDbException: Query failed with error code 2 and error message 'Field 'locale' is invalid in: { locale: "company" }' on server localhost:27017; nested exception is com.mongodb.MongoQueryException: Query failed with error code 2 and error message 'Field 'locale' is invalid in: { locale: "company" }' on server localhost:27017

Strange thing is I am not using any variable like "locale" in company collection. I am able to insert and able to get the count, but none of the findAll* are working, getting the same error.

public interface CompanyRepository extends MongoRepository<Company, String> {
    List<Company> findByName(String name);

    @Query("{'contact.address': ?0}")
    List<Company> findByAddress(String address);
}

@Document(collation = "company")
public class Company {
    private int id;
    private String name;
    private List<Product> products;
    private Contact contact;

    public Company(int id, String name, List<Product> products, Contact contact) {
        this.id = id;
        this.name = name;
        this.products = products;
        this.contact = contact;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }

    public Contact getContact() {
        return contact;
    }

    public void setContact(Contact contact) {
        this.contact = contact;
    }
}

// Client code:      
//this is working fine
int count = (int) companyRepo.count();

// Failing Here
companies = companyRepo.findByName("yy");
like image 880
Akhil Patro Avatar asked Dec 30 '19 15:12

Akhil Patro


2 Answers

@Document(collation="company")

This looks like a typo and the cause of your issue. You try to set collection name, but instead of collection you use collation property: https://docs.mongodb.com/manual/reference/collation/

The correct form of annotation would be:

@Document(collection = "company")
public class Company {
    // ...
}

Or simpler – since value is an alias for collection:

@Document("company")
public class Company {
    // ...
}

You can even completely omit collection name. In that case Spring will use class name as collection name:

@Document // name of collection wil be "company", as per class name
public class Company {
    // ...
}

The last example is why this was working for you with e.g. count queries, even though you did not provide collection name explicitly.

like image 91
Archie Avatar answered Oct 21 '22 11:10

Archie


This sometime happens when you miss annotated entity class with annotation @Document

  • Wrong @Document(collation = "department")

  • Right @Document(collection = "department")

like image 28
Mahadi Hasan Avatar answered Oct 21 '22 11:10

Mahadi Hasan