Запрос на основе N1QL в базе вложенных вложенных объектов - PullRequest
0 голосов
/ 18 мая 2018

Я работаю над профессиональным приложением для социальной сети, использующим couchbase server 4.1 с spring data couchbase 2.2.4 в приложении весенней загрузки с использованием java 1.8.
Я хочу заменить следующий поток, который ищет LikeEntity, конкретной компаниейв базе данных по запросу на основе N1QL, который ищет пользователя с таким же предыдущим безымянным likeEntity:

Вот сервис, содержащий поток для замены запросом:

@Service
class CompanyServiceImpl implements CompanyService{

    @Override
    public void addCompanyToLike(UserEntity user, Company company){
          int incrementValue=1;
          LikeEntity existingLike=user.getLikeEntities()
                                      .stream()
                                      .filter(le->le.getCompany().getName().equals(company.getName()))
                                      .findFirst();
          //rest of process
    }
 }   

Вотразличные Java-бины, которые вам нужно будет посмотреть:

Класс UserEntity:

@Document
@ViewIndexed(designDoc = "user")
class UserEntity implements Serializable{
    @Field private String id;
    @Reference
    private List<LikeEntity> likeEntities=new ArrayList<LikeEntity>();

    //Other attributes plus getters and setters:
}   

Класс LikeEntity:

@Document
class LikeEntity implements serializable{

    @Reference
    private Company company;

    @Reference
    private Job job;

    // other attributes plus getters and setters
}   

Как вы видели выше, класс LikeEntity может содержатьЛюбой объект, понравившийся пользователю, это может быть компания, работа или другой объект.Также LikeEntity хранится только в пользовательском документе как элемент списка лайков пользователя, а не в базе данных независимо. Это мой выбор моделирования, потому что LikeEntity не будет использоваться в других Java-бинах моего приложения

Компания:

@Document
@ViewIndexed(designDoc = "company")
class Company implements Serializable{
  @Field private String id;
  @Field private String name;
  //Other attributes plus getters and setters 
} 

Примечание: я пробовал следующий запрос внутри UserRepository, но он не работал:

UserRepository:

@Repository
@N1qlPrimaryIndexed
@N1qlSecondaryIndexed(indexName = "user")
public interface UserRepository extends CouchbaseRepository<UserEntity, String> {
    @Query("SELECT b.*, likeEntity FROM #{#n1ql.bucket} AS b UNNEST b.likeEntities AS likeEntity WHERE b.id=$1 AND likeEntity.company.name=$2")
    UserEntity findByLikedCompanyName(String idUser
    , String companyName);
}  

Я ищуза ваши ответы, и большое спасибо заранее.

...