【问题标题】:Populate List of entity class objects from sql ResultSet从 sql ResultSet 填充实体类对象列表
【发布时间】:2012-09-23 00:07:50
【问题描述】:

所以我有这个 sql 查询:

    "select company, surveys.surveyID, questionID, question, questionScore FROM surveys INNER JOIN (SELECT * FROM companies INNER JOIN "
            + "(SELECT * FROM questions INNER JOIN categories "
            + "ON questions.catID = categories.catID) AS cats "
            + "ON companies.questionID = cats.questionID) AS yes "
            + "ON yes.surveyID = surveys.surveyID WHERE company=?"

“猫”和“是”没有任何意义,只是我极其冗长的命名方案的牺牲品。

company 只是一个字符串。

它返回的表格如下所示:

 ---------------------------------------------
|companyName|surveyID|questionID|questionScore|
 ---------------------------------------------

此表的主键是 (companyName,surveyID AND QuestionID),因为每个公司可以有多个调查,每个调查都有多个问题。

那我有这个课:

public class Company
{
private String companyName;
private String surveyorName;
private String surveyorTitle;
private int surveyID;
private Map<Integer,Integer> questions;

public Company(String name, String surveyor, String surveyerTitle,
    int surveyID, Map<Integer, Integer> questions)
{
this.companyName = name;
this.surveyorName = surveyor;
this.surveyorTitle = surveyerTitle;
this.surveyID = surveyID;
this.questions = questions;
}

拥有所有的getter和setter

例如,假设有一家 Mens Insamen 公司。调查 ID 为 1。 所以

Mens Insamen    1       q1     3
Mens Insamen    1       q2     1

等等……

现在我需要使用来自 sql 查询的数据填充公司对象列表。我已经尝试了一段时间,但无法真正想出任何东西。

如果(不出所料)不清楚(fokol(no)咖啡),我可以在某个时候改进它。

提前致谢

【问题讨论】:

  • 您确实应该展示了代表您尝试执行此操作的代码。无论如何,这只是一堆样板代码。
  • 我不确定我是否关注?你能用java做sql查询吗?您已经有了一个查询、结果是什么以及一个对象。您可以进行查询,并为每个结果创建一个对象,填充它,然后将其放入您的列表中。你在哪里卡住了?

标签: java sql


【解决方案1】:

create class CompanyMapper 里面有一个方法,将该方法传递给 SQL ResultSet 作为输入,循环遍历它并创建 Company 列表并返回它。

class CompanyMapper{

public List<Company> getCompanies(ResultSet rs){

    ArrayList<Company> compList = new ArrayList<Company>();
    while(...rs has entry...){
        //Add new Company to the list
    }
return compList;
}

【讨论】:

    【解决方案2】:

    这真的很难说,到目前为止你的问题,但如果你想填充自定义对象的列表,那么你需要做这样的事情:

    public List<Company> getCompanies() throws SQLException
    {
        List<Company> result = new ArrayList<Company>();
    
        Connection connection = DriverManager.getConnection(...);
        Statement statement = connection.createStatement();
        ResultSet set = statement.executeQuery("your query here");
    
        set.beforeFirst();
        while(set.next())
        {
            String textData = set.getString("columnname");
            int integerData = set.getInt("columnname");
    
            // you can also use set.getString(columnindex);
    
            Company company = new Company();
            company.set(...);
    
            result.add(company);
        }
        connection.close();
        return result;
    }
    

    【讨论】:

      【解决方案3】:

      您可以简单地使用 arraylist 和您的 while 循环来实现这一点
      为循环外的 compine 创建您的数组列表,并
      使用循环将每个 Company 对象添加到此数组列表中

      ArrayList<Company> compList = new ArrayList<Company>();
      
      while{
      
      /*read  values to variables and create an object of Company 
        then add to arraylist as follows **/
      
      Company comp = new Company (name, surveyor, surveyerTitle,surveyID,questions);    
      compList.add(comp);
      }
      

      【讨论】:

      • 我认为您可以使用 while 循环生成查询结果,那么您要做的就是在我的回答中为查询中的每一行创建一个新对象并将其添加到数组列表中被声明在循环之外
      【解决方案4】:

      1- 你应该创建一个到数据库的连接,

      Class.forName(DB_LIBRARY);
      connection = DriverManager.getConnection(CONNECTION_PARAMETRS);
      

      请注意,您需要将 DB_LIBRARY 替换为有效的驱动程序库,并将 CONNECTION_PARAMETERS 替换为您的数据库连接设置(例如主机名、用户名、密码等)。

      2- 创建语句,并返回结果集

      Statement statement = connection.createStatement();
      ResultSet rs = statement.executeQuery(your_select_query);
      

      3-遍历结果集并获取数据

      Company company;
      while(rs.next()){
               company = new Company(rs.getString(1), 
               rs.getString(2), 
               rs.getString(3), 
               rs.getInt(4),
               new HashMap<Integer, Integer>().put(rs.getInt(5), rs.getInt(6)
      }
      

      请注意,您可以使用列名或列号,如果您想获取多条记录,也可以使用 ArrayList,如下所示

      ArrayList<Company> companies = new ArrayList<Company>();
      while(rs.next()){
               companies.add(new Company(rs.getString(1), 
               rs.getString(2), 
               rs.getString(3), 
               rs.getInt(4),
               new HashMap<Integer, Integer>().put(rs.getInt(5), rs.getInt(6));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-09
        相关资源
        最近更新 更多