从通过DQL Documentum的检索数据的行(retrieve a row of data fr

2019-09-29 03:32发布

我在我的列表视图的用户是通过从Documentum的检索数据填充的列表。 如果我点击这个至少任何行(每一行代表一个用户),我应该能够看到所有的上市下来的信息( 这是我的问题

public void selectedItemFromListView(){
     selected = lwAllUserGrp.getSelectionModel().getSelectedItem();
     System.out.println(selected);
     String query =" select * from dm_user where user_name = '@aclName'" ;
     String test = query.replace("@aclname", selected);

     GetDataWithDqlProfile(_session , query , "user_login_name" , "user_address" , "user_state" );
     System.out.println(user.getAddress());
     System.out.println(user.getState());
     System.out.println(user.getUsername());

}

如果我点击列表视图的一排,我可以顺利看到谁被选中,我需要通过DQL来检索Documentum的该用户名(同一人)的所有其他属性。

private void GetDataWithDqlProfile(IDfSession session, String Query, String username , String address , String state ) {

    try {
        IDfQuery UpdateQuery = new DfQuery();
        UpdateQuery.setDQL(Query);
        IDfCollection col = UpdateQuery.execute(_session, IDfQuery.DF_QUERY);


            user.setAddress(col.getString(username));
            user.setUsername(col.getString(address));
            user.setState(col.getString(state));

        col.close();
    } catch (Exception e) {
        Alert alert = new Alert(Alert.AlertType.ERROR, e.getMessage());
        alert.showAndWait();
        Logs.WriteLog(LoginController.Repository + ",User:" + LoginController.Username, "DQL Query", e.toString());
        e.getStackTrace();
    }

我的输出是:

User's name 
null
null 
null 

我试着在DQL测试仪DQL查询和它运作良好

Answer 1:

为了从IDfCollection提取行你必须调用next()收集对象。 这种方法既前进到下一行,如果成功返回一个布尔值。 使用布尔测试(例如, whileif )迭代,就像这样:

IDfCollection col = UpdateQuery.execute(_session, IDfQuery.DF_QUERY);

if (col.next()) {
    user.setAddress(col.getString(username));
    user.setUsername(col.getString(address));
    user.setState(col.getString(state));
}

col.close();

迭代非常必要,即使集合包含只有一行。 换句话说,你需要手动推进到第一行。



Answer 2:

1)由于@eiviamu已经提到的,你必须调用IDfCollection.next()来获得下一行。
2)你的代码,其他方面的问题,有一个Documentum的相关:收集的收盘必须总是发生finally块。
否则,你可以得到未闭合的集合可能导致内存泄漏和怪异的应用程序行为(例如,如果我没有记错的有9个同时打开的集合被允许在默认情况下一个DCTM会话,如果超出此限制将引发异常)



Answer 3:

对于那些你提到这个问题后来这里是我如何解决了这个问题:

public ArrayList<User> GetDataWithDqlpro(IDfSession session, String Query, String username , String state , String address) {

    try {
        IDfQuery UpdateQuery = new DfQuery();
        UpdateQuery.setDQL(Query);
        IDfCollection col = UpdateQuery.execute(_session, IDfQuery.DF_QUERY);

        while (col.next()) {
            list.add( new User(col.getString(username),col.getString(address) , col.getString(state)));

        }
        col.close();

    }catch (Exception e) {
            Alert alert = new Alert(Alert.AlertType.ERROR, e.getMessage());
            alert.showAndWait();
            Logs.WriteLog(LoginController.Repository + ",User:" + LoginController.Username, "DQL Query", e.toString());
            e.getStackTrace();
}
        return (ArrayList<User>) list;

}



public void selectedItemFromListView(){
     selected = lwAllUserGrp.getSelectionModel().getSelectedItem();
     System.out.println(selected);
     String Query = "select user_login_name , user_state , user_address from dm_user where user_login_name ='@aclname'";
     Query = Query.replace("@aclname",selected );
     ArrayList<User> allUserNames = GetDataWithDqlpro(_session, Query, "user_login_name","user_address","user_state");
     for (int i = 0 ; i <= allUserNames.size()-1 ; i++ ){
         if (selected.compareToIgnoreCase(allUserNames.get(i).getUsername() ) == 0){
                System.out.println(allUserNames.get(i).getState() );
                System.out.println(allUserNames.get(i).getAddress() );
                System.out.println(allUserNames.get(i).getUsername() );

         }

     }

}

值得一提的是,我有一个名为一类用户具有构造函数和get和set方法

我希望这将帮助一些一个:)



文章来源: retrieve a row of data from documentum via DQL