首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql错误,当我在JAVA代码中实现联接时

Sql错误,当我在JAVA代码中实现联接时
EN

Stack Overflow用户
提问于 2015-09-16 22:29:07
回答 1查看 457关注 0票数 1

我有两张桌子。

第一桌,

Profession和两个columns (profession_id, profession_name)

第二桌,

Applicant和五columns (applicant_id, profession_id, last_name, first_name, entrance_year)

Applicant中的Applicant和表Profession中的profession_id是MySQL中的相关字段。

我需要,而不是profession_id,得到一个下拉列表的可用职业。在这里,我使用INNER JOIN实现了

这是我的班,和DB一起工作:

代码语言:javascript
复制
public enum ApplicantDBProvider {

INSTANCE;

private Connection connection;

private ApplicantDBProvider() {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_applicant", "root", "toor");
    } catch (ClassNotFoundException | SQLException e) {
        System.err.println("Class not found: com.mysql.jdbc.Driver " + e);
        throw new RuntimeException("Class not found: com.mysql.jdbc.Driver");
    }
}

public Applicant getApplicant(long applicantId) throws Exception {
    PreparedStatement preparedStatement = null;
    Applicant applicant = null;
    try {
        preparedStatement = connection.prepareStatement("SELECT * FROM applicant WHERE applicant_id=?");
        preparedStatement.setInt(1, (int) applicantId);

        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            applicant = new Applicant();
            applicant.setId(resultSet.getInt("applicant_id"));
            applicant.setFirstName(resultSet.getString("first_name"));
            applicant.setLastName(resultSet.getString("last_name"));
            applicant.setProfessionId(resultSet.getInt("profession_id"));
            applicant.setEntranceYear(resultSet.getInt("entrance_year"));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (preparedStatement != null) {
            preparedStatement.close();
        }
    }

    return applicant;
}

public List<Applicant> getApplicants() throws Exception {
    Statement statement = null;
    List <Applicant> applicants = new ArrayList<>();

    try {
        statement = connection.createStatement();
        //ResultSet resultSet = statement.executeQuery("SELECT * FROM applicant");
        ResultSet resultSet = statement.executeQuery("select a.applicant_id, a.first_name, a.last_name, a.entrance_year, p.profession_name from applicant a join profession p on a.profession_id = p.profession_id");
        Applicant applicant = null;
        while (resultSet.next()) {
            applicant = new Applicant();
            applicant.setId(resultSet.getInt("applicant_id"));
            applicant.setFirstName(resultSet.getString("first_name"));
            applicant.setLastName(resultSet.getString("last_name"));
            applicant.setProfessionId(resultSet.getInt("profession_id"));
            applicant.setEntranceYear(resultSet.getInt("entrance_year"));
            applicants.add(applicant);

        }

    } catch (SQLException e) {
        throw new Exception(e);
    }

    return applicants;
}

public void saveApplicant(Applicant applicant) throws Exception {
    PreparedStatement preparedStatement = null;

    try {
        if (applicant.getId() == -1) {
            preparedStatement = connection.prepareStatement("INSERT INTO applicant (first_name, last_name, profession_id, entrance_year) VALUES (?,?,?,?)");

            preparedStatement.setString(1, applicant.getFirstName());
            preparedStatement.setString(2, applicant.getLastName());
            preparedStatement.setInt(3, (int)applicant.getProfessionId());
            preparedStatement.setInt(4, applicant.getEntranceYear());

        } else {
            preparedStatement = connection.prepareStatement("UPDATE applicant SET first_name=?, last_name=?, profession_id=?, entrance_year=?  WHERE applicant_id=?");

            preparedStatement.setString(1, applicant.getFirstName());
            preparedStatement.setString(2, applicant.getLastName());
             preparedStatement.setInt(3, (int) applicant.getProfessionId());
            preparedStatement.setInt(4, applicant.getEntranceYear());
            preparedStatement.setInt(5, (int) applicant.getId());
        }
        preparedStatement.executeUpdate();
    } catch (SQLException e) {
        throw new Exception(e);
    } finally {
        if (preparedStatement != null) {
            preparedStatement.close();
        }
    }
}

public Profession getProfession(long professionId) throws Exception {
    PreparedStatement preparedStatement = null;
    Profession profession = null;
    try {
        preparedStatement = connection.prepareStatement("SELECT * FROM profession WHERE profession_id=?");
        preparedStatement.setInt(1, (int) professionId);

        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            profession = new Profession();
            profession.setId(resultSet.getInt("profession_id"));
            profession.setProfessionName(resultSet.getString("profession_name"));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (preparedStatement != null) {
            preparedStatement.close();
        }
    }

    return profession;
}

public List<Profession> getProfessions() throws Exception {
    Statement statement = null;

    List<Profession> professions = new ArrayList<>();
    try {
        statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("SELECT * FROM profession");
        Profession profession = null;
        while (resultSet.next()) {
            profession = new Profession();
            profession.setId(resultSet.getInt("profession_id"));
            profession.setProfessionName(resultSet.getString("profession_name"));
            professions.add(profession);
        }

    } catch (SQLException e) {
        throw new Exception(e);
    } finally {
        if (statement != null) {
            statement.close();
        }
    }

    return professions;
}

public void saveProfession(Profession profession) throws Exception {
    PreparedStatement preparedStatement = null;

    try {
        if (profession.getId() == -1) {
            preparedStatement = connection.prepareStatement("INSERT INTO profession (profession_name) VALUES (?) ");

            preparedStatement.setString(1, profession.getProfessionName());
        } else {
            preparedStatement = connection.prepareStatement("UPDATE profession SET profession_name=? WHERE profession_id=?");

            preparedStatement.setString(1, profession.getProfessionName());
            preparedStatement.setInt(2, (int) profession.getId());
        }
        preparedStatement.executeUpdate();
    } catch (SQLException e) {
        throw new Exception(e);
    } finally {
        if (preparedStatement != null) {
            preparedStatement.close();
        }
    }

}

我的jsp:

代码语言:javascript
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
  <title></title>
</head>
<body>
<h1>Add applicant</h1>

<form method="post" action="controller?command=saveApplicant">

  <table>
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Profession ID</th>
      <th>Entrance Year</th>
    </tr>
  </table>

  <c:choose>
    <c:when test="${applicant ne null}">
      <input type="text" name="first_name" value="${applicant.getFirstName()}"/>
      <input type="text" name="last_name" value="${applicant.getLastName()}"/>
      <input type="text" name="profession_id" value="${applicant.getProfessionId()}"/>
      <input type="text" name="entrance_year" value="${applicant.getEntranceYear()}"/>
      <input type="hidden" name="applicant_id" value="${applicant.getId()}"/>
    </c:when>
    <c:otherwise>
      <input type="text" name="first_name" value=""/>
      <input type="text" name="last_name" value=""/>
      <input type="text" name="profession_id" value=""/>
      <input type="text" name="entrance_year" value=""/>
    </c:otherwise>
  </c:choose>
  <input type=submit value=submit>
</form>
</body>
</html>

我在数据库中实现了这个查询(您可以在我的代码中看到):

代码语言:javascript
复制
select a.applicant_id, a.first_name, a.last_name, a.entrance_year, p.profession_name from applicant a join profession p on a.profession_id = p.profession_id

但是,当我运行服务器并打开jsp时,出现了错误: java.lang.Exception: java.sql.SQLException:列'profession_id‘未找到。

我不明白,这是一个多么大的错误。会是什么?请告诉我。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-16 22:42:07

编辑:

在这个查询中,

从申请者中选择a.applicant_id,a.first_name,a.last_name,a.entrance_year,p.profession_name,p.profession_id

你只有,

a.applicant_id,a.first_name,a.last_name,a.entrance_year,p.profession_name

没有p.profession_id

所以当你做一个,

代码语言:javascript
复制
applicant.setProfessionId(resultSet.getInt("profession_id"));

您将得到一个异常,因为结果列表中没有该列。

代码语言:javascript
复制
ResultSet resultSet = statement.executeQuery("select a.applicant_id, a.first_name, a.last_name, a.entrance_year, p.profession_name, p.profession_id from applicant a join profession p on a.profession_id = p.profession_id");

回答你的,

我有课。Applicant.java。在这个类中,我有长数据类型的professionId。现在是我的问题。当我更改applicant.setProfessionId(resultSet.getInt("profession_id")) on applicant.setProfessionId(resultSet.getString("profession_name")),时,我需要将professionId更改为字符串数据类型

可以将类变量添加到Application.java类中,

作为,

代码语言:javascript
复制
private String professionName;

public String getProfessionName(){
    return professionName;
}


public String setProfessionName(String professionName){
    this.professionName = professionName
}

两者兼有,

代码语言:javascript
复制
applicant.setProfessionId(resultSet.getInt("profession_id"));
applicant.setProfessionName(resultSet.getString("profession_name"));

不过,

如果你在尝试,我引用你的话

而不是profession_id,得到一个可用职业的下拉列表。

您应该以不同的方式来处理这个问题,因为这个联接只会为一个profession_name提供一个application

在taglib和数据绑定上拥有一个战利品。

编辑2:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32619823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档