'How to get List of Objects with value in array in Spring-Boot CrudRepository
I have an Object defined that has ChildAccountList of Strings as one of the attributes.
Is there a findBy method that I can use such that it will return the list of all rows where one of the elements in the array equals the passed in parameter. I mean something like:
List <String> childrenAccountsList = Arrays.asList("A","B","C");
List<DBObjectType> retList = findBy_{whatGoesHere} (String childValue);
List<DBObjectType> retList = findBy_{whatGoesHere} ("A");
UPDATE ( with example )
Here are my class definitions
UserREF.java
package test;
import com.microsoft.azure.spring.data.documentdb.core.mapping.Document;
import com.microsoft.azure.spring.data.documentdb.core.mapping.PartitionKey;
import org.springframework.data.annotation.Id;
import java.util.List;
@Document(collection = "user-management")
public class UserREF{
   @Id
   private String id;
   private String userId;
   private String role;
   private String primaryAccountId;
   @PartitionKey
   private String partition;
   private String shipTo;
//   @ElementCollection
   private List<ShipToAccounts> childShipToAccounts;
   public String getUserId(){
      return userId;
   }
   public void setUserId(String userId){
      this.userId = userId;
   }
   public String getRole(){
      return role;
   }
   public void setRole(String role){
      this.role = role;
   }
   public String getPrimaryAccountId(){
      return primaryAccountId;
   }
   public void setPrimaryAccountId(String primaryAccountId) {
      this.partition = primaryAccountId;
      this.primaryAccountId = primaryAccountId;
   }
   public String getPartition() {
      this.partition = this.primaryAccountId;
      return this.partition;
   }
   public void setPartition(String partition) {
      this.partition = this.primaryAccountId;
   }
   public String getShipTo(){
      return shipTo;
   }
   public void setShipTo(String shipTo){
      this.shipTo = shipTo;
   }
   public List<ShipToAccounts> getChildShipToAccounts(){
      return childShipToAccounts;
   }
   public void setChildShipToAccounts(List<ShipToAccounts> shipToAccounts){
      for (ShipToAccounts shipToAccount : shipToAccounts) {
         shipToAccount.setPrimaryAccountId(this.primaryAccountId);
      }
      this.childShipToAccounts = shipToAccounts;
   }
   public String getId(){
      return id;
   }
   public void setId(String id){
      this.id = id;
   }
}
ShipToAccounts.java
package test;
public class ShipToAccounts{
   private String primaryAccountId;
   private String accountId;
   public String getPrimaryAccountId() {
      return primaryAccountId;
   }
   public void setPrimaryAccountId(String primaryAccountId) {
      this.primaryAccountId = primaryAccountId;
   }
   public String getAccountId(){
      return accountId;
   }
   public void setAccountId(String input){
      this.accountId = input;
   }
}
UserREFRepository.java
package test;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.microsoft.azure.spring.data.documentdb.core.DocumentDbOperations;
import com.microsoft.azure.spring.data.documentdb.repository.DocumentDbRepository;
import java.util.List;
@Repository
@ConditionalOnBean(DocumentDbOperations.class)
public interface UserREFRepository  extends DocumentDbRepository<UserREF, String> {
   @Override
   @Cacheable("test_users")
   UserREF findOne(String id, String partitionKeyValue);
   List<UserREF> findByRole(String role);
   List<UserREF> findByChildShipToAccounts_PrimaryAccountId (@Param("primaryAccountId") String primaryAccountId);
   List<UserREF> findAllByChildShipToAccounts_PrimaryAccountId(String s);
}
UserRefService.java
package test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
@Service
public class UserRefService {
   private static final Logger log = LoggerFactory.getLogger(UserRefService.class);
   @Autowired
   private UserREFRepository userREFRepository;
   public UserREF save(UserREF inUser) {
      List<UserREF> adminUsersList =  userREFRepository.findAllByChildShipToAccounts_PrimaryAccountId("123456");
      System.out.println("users " + adminUsersList);
      UserREF newUser = userREFRepository.save(inUser);
      return newUser;
   }
}
And this is how my JSON document looks like
    {
    "role": "admin",
    "partition": "123456",
    "primaryAccountId": "123456",
    "childShipToAccounts": [
        {
            "accountId": "1111",
            "primaryAccountId": "123456"
        },
        {
            "accountId": "2222",
            "primaryAccountId": "123456"
        },
        {
            "accountId": "3333",
            "primaryAccountId": "123456"
        }
    ],
    "id": "1b6d8497-1aca-4cab-9e3d-f8be3ba4f71c",
    "userId": "22",
    "shipTo": "2222"
}
I am getting below error on List<UserREF> adminUsersList =  userREFRepository.findAllByChildShipToAccounts_PrimaryAccountId("123456");
java.lang.IllegalStateException: com.microsoft.azure.documentdb.DocumentClientException: 
    Message: {"Errors":["Invalid query. Specified parameter name '@childShipToAccounts.primaryAccountId' is invalid. 
    Parameter names should be in the format of symbol '@' followed by a valid identifier. E.g. @param1"]}
ActivityId: fd188aac-f99c-4983-b442-713c529dc930, Microsoft.Azure.Documents.Common/2.1.0.0, StatusCode: BadRequest
How should I define my "findBy" method ?
Thanks
Solution 1:[1]
Try findByChildrenAccountsListContaining(yourString)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | Ashish Gupta | 
