【问题标题】:retrieve a row of data from documentum via DQL通过 DQL 从 documentum 中检索一行数据
【发布时间】:2016-09-13 22:24:31
【问题描述】:

我的列表视图中有一个用户列表,该列表是通过从 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 查询,效果很好

【问题讨论】:

    标签: javafx dql documentum


    【解决方案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();
    

    即使集合仅包含一行,也需要迭代。也就是说,你需要手动前进到第一行。

    【讨论】:

    • 错误消失了,但我仍然得到所有 3 个 null ;) @eivamu
    • 尝试在if(){} 块内添加一些调试输出,看看next() 是否返回true。如果不是这种情况,则您的 DQL 是错误的,或者只是简单地返回一个空集合(无行)。
    【解决方案2】:

    1) 正如@eiviamu 已经提到的,您必须调用 IDfCollection.next() 才能获取下一行。
    2) 除了其他问题外,您的代码有一个与文档相关的问题:集合的关闭必须在finally 块中总是发生。
    否则,您可能会得到未关闭的集合,这可能会导致内存泄漏和奇怪的应用程序行为(例如,如果我没记错的话,默认情况下,一个 DCTM 会话允许同时打开 9 个集合,如果超出此限制,则会抛出异常)

    【讨论】:

      【解决方案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() );
      
               }
      
           }
      

      }

      值得一提的是,我有一个名为 User 的类,它带有构造函数以及 get 和 set 方法

      我希望它会帮助一些人:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多