Как сделать несколько слоев запроса в корде, из одной схемы в другую - PullRequest
0 голосов
/ 29 апреля 2020

Итак, я хочу запросить 3 состояния в корде, но я получу только один критерий запроса от пользователя. поэтому я буду запрашивать 1-е состояние из критериев запроса, теперь я буду запрашивать 2-е состояние с указанным значением c из результата 1-го состояния, а в последнем я буду запрашивать 3-е состояние из указанного c результата из 2-го состояния. и в последнем я получу значение c из 3-го состояния

, поэтому любой может объяснить мне, как это сделать. Я пробовал, но он возвращает нулевое значение вот мой код

 @GetMapping("PledgeData")
    public APIResponse<List<String>> getPledgeData(@RequestParam("pledgeIdFromUser") String pledgeIdFromUser){

        //from the user i have taken the PledgeId and using it as a query criteria

    try {
        FieldInfo pledgeId1 = null;
        try {
            pledgeId1  = getField("pledgeId", PledgeSchema.PersistentPledge.class);

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        QueryCriteria allDataRelatedToPledgeIdInPledgeState = new QueryCriteria.VaultCustomQueryCriteria
                (Builder.equal(pledgeId1, pledgeIdFromUser));

        List<StateAndRef<PledgeState>> results1 = activeParty.vaultQueryByCriteria

                ( allDataRelatedToPledgeIdInPledgeState, PledgeState.class).getStates();

// so i have retrieved all the branchId from PledgeState using pledge id

        List<String> allBranchIds =results1.stream().map(stateStateAndRef -> stateStateAndRef.getState().getData().getBranchId()).collect(Collectors.toList());

        // now i want to iterate all the branchID to find the winner in PledgeUpdateState
        //so here my input will be branchID

        List<String> allWinner = null;
        for(String allBranchId:allBranchIds ){
            FieldInfo branchId = null;
            try {
            branchId  = getField("branchId", PledgeResultSchema.PersistentPledge1.class);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
            QueryCriteria allDataRelatedToPledgeIdInPledgeUpdateState = new 
                QueryCriteria.VaultCustomQueryCriteria(Builder.equal(branchId, allBranchId));

            List<StateAndRef<PledgeUpdateState>> results2 = activeParty.vaultQueryByCriteria
                    ( allDataRelatedToPledgeIdInPledgeUpdateState, PledgeUpdateState.class).getStates();
            allWinner  = results2.stream().map(stateStateAndRef -> stateStateAndRef.getState().getData()
                    .getWinner()).collect(Collectors.toList());
        }

        // now here i want to return all the winner in the PledgeUpdateState

        return APIResponse.success(allWinner);
    }catch (Exception e){
            return APIResponse.error(e.getMessage());
        }

    }```

Ответы [ 2 ]

0 голосов
/ 04 мая 2020
public APIResponse getAllPledgeId(@RequestParam("userIdFromUser") String userIdFromUser) {
    try {
        FieldInfo userId1 =null;
            try {

                userId1 = getField("userName", BidStateSchemas.PersistentBid.class);
            }catch (NoSuchFieldException e){
                e.printStackTrace();
            }
        QueryCriteria allDataRelatedToUserIdInBidState = new QueryCriteria.VaultCustomQueryCriteria
                (Builder.equal(userId1, userIdFromUser));

        List<StateAndRef<BidState>> results1 = activeParty.vaultQueryByCriteria
                ( allDataRelatedToUserIdInBidState, BidState.class).getStates();

         ArrayList allPledgeIds = (ArrayList) results1.stream().map(stateStateAndRef -> stateStateAndRef.getState().getData()
                 .getPledgeId()).collect(Collectors.toList());
        ArrayList allBranchName = new ArrayList();
        ArrayList allAuctionDate =new ArrayList();
      List allPledgeStatus = new ArrayList();
        ArrayList allBranchIds = new ArrayList();
        for(int i = 0; i < allPledgeIds.size(); i++) {
            FieldInfo PledgeId = null;
            try {
                PledgeId  = getField("pledgeId", PledgeSchema.PersistentPledge.class);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
            QueryCriteria allDataRelatedToPledgeIdInPledgeUpdateState = new QueryCriteria.VaultCustomQueryCriteria
                    (Builder.equal(PledgeId, allPledgeIds.get(i)));

            List<StateAndRef<PledgeState>> results2 = activeParty.vaultQueryByCriteria
                    ( allDataRelatedToPledgeIdInPledgeUpdateState, PledgeState.class).getStates();

            allBranchIds.add(results2.stream().map(stateStateAndRef -> stateStateAndRef.getState()
                    .getData().getBranchId()).collect(Collectors.toList())) ;
            allPledgeStatus.add( results2.stream().map(stateStateAndRef -> stateStateAndRef.getState()
                    .getData().getPledgeStatus()).collect(Collectors.toList()))  ;
            for(int j = 0;j < allBranchIds.size(); j++){
                FieldInfo branchId = null;
                try {
                    branchId  = getField("branchId", StartAuctionSchema.PersistentAuction.class);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                }
                QueryCriteria allDataRelatedToBranchIdInStartAuctionState = new QueryCriteria.VaultCustomQueryCriteria
                        (Builder.equal(branchId, allBranchIds.get(j)));

                List<StateAndRef<StartAuctionState>> results3 = activeParty.vaultQueryByCriteria
                        ( allDataRelatedToBranchIdInStartAuctionState, StartAuctionState.class).getStates();
                allBranchName.add( results3.stream().map(stateStateAndRef -> stateStateAndRef.getState()
                        .getData().getBranchName()).collect(Collectors.toList()));
                allAuctionDate.add(results3.stream().map(stateStateAndRef -> stateStateAndRef.getState()
                        .getData().getAuctionDate()).collect(Collectors.toList())) ;
            }
        }
        ArrayList allData= new ArrayList();
        allData.add(allPledgeIds);
        allData.add(allPledgeStatus);
        allData.add(allBranchName);
        allData.add(allAuctionDate);


        return APIResponse.success(allData);
    }catch (Exception e){
        return APIResponse.error(e.getMessage());
        }
    }
0 голосов
/ 29 апреля 2020

Я думаю, вы перезаписываете переменную allWinner в каждой итерации branchId. Последний найденный, вероятно, не имеет победителей, поэтому null.

Я думаю, что лучшим подходом будет использование нативного запроса, поскольку у вас уже есть схема для ваших состояний. Посмотрите пример ниже, вы могли бы очень хорошо использовать оператор соединения.

String nativeQuery = "SELECT * FROM HOUSE_DETAIL";
try {
    List<PersistentHouse> resultList  = new ArrayList<>();
    ResultSet rs = getServiceHub().jdbcSession().prepareStatement(nativeQuery).executeQuery();
    while (rs.next()){
        PersistentHouse house = new PersistentHouse(rs.getString(3), rs.getInt(4),
                rs.getInt(5), rs.getInt(7),
                getServiceHub().getNetworkMapCache().getPeerByLegalName(CordaX500Name.parse(rs.getString(6))));
        resultList.add(house);
    }

    return resultList;
}catch (SQLException se){
    throw new FlowException(se.getCause());
}

Примечание: потоки также поддерживают JPA, вы можете использовать serviceHub.withEntityManager

...