通过 DQL 从 documentum 中检索一行数据
retrieve a row of data from documentum via DQL
我的列表视图中有一个用户列表,它是通过从 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 查询,效果很好
为了从 IDfCollection 中获取行,您必须对集合对象调用 next()
。如果成功,此方法既会前进到下一行,又会 returns 一个布尔值。使用布尔测试(例如 while
或 if
)进行迭代,如下所示:
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();
即使集合只包含一行,迭代也是必要的。换句话说,您需要手动前进到第一行。
对于那些稍后提到这个问题的人,这里是我解决问题的方法:
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 的 class 带有构造函数以及获取和设置方法
希望对大家有所帮助:)
1) 正如@eiviamu 已经提到的,您必须调用 IDfCollection.next() 才能获取下一行。
2) 除其他问题外,您的代码还有一个与 documentum 相关的问题:集合的关闭必须 always 在 finally
块中发生。
否则你可以获得未关闭的集合,这可能会导致内存泄漏和奇怪的应用程序行为(例如,如果我没记错的话,默认情况下一个 DCTM 会话允许同时打开 9 个集合,如果超过此限制,将抛出异常)
我的列表视图中有一个用户列表,它是通过从 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 查询,效果很好
为了从 IDfCollection 中获取行,您必须对集合对象调用 next()
。如果成功,此方法既会前进到下一行,又会 returns 一个布尔值。使用布尔测试(例如 while
或 if
)进行迭代,如下所示:
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();
即使集合只包含一行,迭代也是必要的。换句话说,您需要手动前进到第一行。
对于那些稍后提到这个问题的人,这里是我解决问题的方法:
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 的 class 带有构造函数以及获取和设置方法
希望对大家有所帮助:)
1) 正如@eiviamu 已经提到的,您必须调用 IDfCollection.next() 才能获取下一行。
2) 除其他问题外,您的代码还有一个与 documentum 相关的问题:集合的关闭必须 always 在 finally
块中发生。
否则你可以获得未关闭的集合,这可能会导致内存泄漏和奇怪的应用程序行为(例如,如果我没记错的话,默认情况下一个 DCTM 会话允许同时打开 9 个集合,如果超过此限制,将抛出异常)