【问题标题】:How to do multiple layer of query in corda , from one schema to another如何在corda中进行多层查询,从一种模式到另一种模式
【发布时间】:2020-05-04 13:45:16
【问题描述】:

所以我想在 Corda 中查询 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());
        }

    }```

【问题讨论】:

    标签: blockchain corda


    【解决方案1】:

    我认为您在 branchId 的每次迭代中都会覆盖您的 allWinner 变量。最后找到的可能没有任何获胜者,因此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());
    }
    

    注意:Flows 也支持 JPA,您可以使用 serviceHub.withEntityManager

    【讨论】:

    • 感谢这一点以及在执行查询流后它显示start done the result of the flow 这三个薄但我不想要这些东西我想以不同的方式格式化我的输出所以我该怎么做呢跨度>
    【解决方案2】:
    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());
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多