java - JPA/JPQL 查询错误

标签 java mysql sql jpa

我正在尝试从数据库中检索一组结果(13 个标记)只会调用 1 行,然后我想对查询中的 13 个结果进行平均,然后返回值

我已经创建了查询:

public String markingAvg(Marking id) {
    System.out.println("id = " + id);
    Query m = em.createQuery("SELECT (m.markSectionOne + m.markSectionTwo + m.markSectionThree + m.markSectionFour + m.markSectionFive + m.markSectionSix + m.markSectionSeven + m.markSectionEight + m.markSectionNine + m.markSectionTen + m.markSectionEleven + m.markSectionTwelve + m.markSectionThirteen) FROM MARKING m WHERE m.id = :id", Double.class);
    m.setParameter("id", id);

    Object avg = m.getSingleResult();
    return null;
}

不知道这样说对不对,欢迎大家指正

我通过测试按钮调用它:

初始化

            String marking_id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("edit_id");
    System.out.println(marking_id);
    if (marking_id != null) {
        this.markToEdit = this.markingFacade.find(Long.parseLong(marking_id));
    }

    marksByMarkingId = markingFacade.markingAvg(markToEdit);
}

按钮调用:

public void markSearch() {
    searchAvgResults = markingFacade.markingAvg(markToEdit);

}

但是在初始化时(marksByMarkingId 是在 init 中完成的)

我得到了错误

java.lang.IllegalArgumentException: You have attempted to set a value of type class sws.entities.Marking for parameter id with expected type of class java.lang.Long from query string SELECT (m.markSectionOne + m.markSectionTwo + m.markSectionThree + m.markSectionFour + m.markSectionFive + m.markSectionSix + m.markSectionSeven + m.markSectionEight + m.markSectionNine + m.markSectionTen + m.markSectionEleven + m.markSectionTwelve + m.markSectionThirteen) FROM MARKING m WHERE m.id = :id.

任何想法伙计们或者有没有人有更好的方法来做到这一点?

谢谢大家

这里是标记实体

@实体(名称=“标记”) 公共(public)类标记实现可序列化{

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@ManyToOne
private Person marker;

@ManyToOne
private Project project;

// @ManyToOne
//  private Project project;
//@ManyToMany(mappedBy = "title")
//private Project projectBeMarked;
;

private String markingCompleted, thirdMarker, plagorism, markSectionOne, markSectionTwo, markSectionThree, markSectionFour,
        markSectionFive, markSectionSix, markSectionSeven, markSectionEight,
        markSectionNine, markSectionTen, markSectionEleven, markSectionTwelve, markSectionThirteen, markAdjust, overalMark;

我想做的是检索一个 id(我通过从网址传递它来实现)然后想要平均 markSectionOne - 13

id 的 getter/setter

 /**
     *
     * @return
     */
    public Long getId() {
        return id;
    }

    /**
     *
     * @param id
     */
    public void setId(Long id) {
        this.id = id;
    }

感谢这里的好人,现在修复了

但是,当我按下测试按钮运行查询时,我在控制台中收到以下错误

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: The '+' operator with a left operand type of 'VARCHAR' and a right operand type of 'VARCHAR' is not supported.
Error Code: -1
Call: SELECT (MARKSECTIONONE + (MARKSECTIONTWO + (MARKSECTIONTHREE + (MARKSECTIONFOUR + (MARKSECTIONFIVE + (MARKSECTIONSIX + (MARKSECTIONSEVEN + (MARKSECTIONEIGHT + (MARKSECTIONNINE + (MARKSECTIONTEN + (MARKSECTIONELEVEN + (MARKSECTIONTWELVE + MARKSECTIONTHIRTEEN)))))))))))) FROM MARKING WHERE (ID = 48)
Query: ReportQuery(referenceClass=Marking sql="SELECT (MARKSECTIONONE + (MARKSECTIONTWO + (MARKSECTIONTHREE + (MARKSECTIONFOUR + (MARKSECTIONFIVE + (MARKSECTIONSIX + (MARKSECTIONSEVEN + (MARKSECTIONEIGHT + (MARKSECTIONNINE + (MARKSECTIONTEN + (MARKSECTIONELEVEN + (MARKSECTIONTWELVE + MARKSECTIONTHIRTEEN)))))))))))) FROM MARKING WHERE (ID = ?)")

当前遇到错误

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: TYPE 'UNSIGNED' does not exist.
Error Code: -1
Call: SELECT (CAST(MARKSECTIONONE AS UNSIGNED) + (CAST(MARKSECTIONTWO AS UNSIGNED) + (CAST(MARKSECTIONTHREE AS UNSIGNED) + (CAST(MARKSECTIONFOUR AS UNSIGNED) + (CAST(MARKSECTIONFIVE AS UNSIGNED) + (CAST(MARKSECTIONSIX AS UNSIGNED) + (CAST(MARKSECTIONSEVEN AS UNSIGNED) + (CAST(MARKSECTIONEIGHT AS UNSIGNED) + (CAST(MARKSECTIONNINE AS UNSIGNED) + (CAST(MARKSECTIONTEN AS UNSIGNED) + (CAST(MARKSECTIONELEVEN AS UNSIGNED) + (CAST(MARKSECTIONTWELVE AS UNSIGNED) + CAST(MARKSECTIONTHIRTEEN AS UNSIGNED))))))))))))) FROM MARKING WHERE (ID = 48)
Query: ReportQuery(referenceClass=Marking sql="SELECT (CAST(MARKSECTIONONE AS UNSIGNED) + (CAST(MARKSECTIONTWO AS UNSIGNED) + (CAST(MARKSECTIONTHREE AS UNSIGNED) + (CAST(MARKSECTIONFOUR AS UNSIGNED) + (CAST(MARKSECTIONFIVE AS UNSIGNED) + (CAST(MARKSECTIONSIX AS UNSIGNED) + (CAST(MARKSECTIONSEVEN AS UNSIGNED) + (CAST(MARKSECTIONEIGHT AS UNSIGNED) + (CAST(MARKSECTIONNINE AS UNSIGNED) + (CAST(MARKSECTIONTEN AS UNSIGNED) + (CAST(MARKSECTIONELEVEN AS UNSIGNED) + (CAST(MARKSECTIONTWELVE AS UNSIGNED) + CAST(MARKSECTIONTHIRTEEN AS UNSIGNED))))))))))))) FROM MARKING WHERE (ID = ?)")

关于查询:

public String markingAvg(Marking id) {
    System.out.println("In MarkingAvg");
    System.out.println("id = " + id);
    System.out.println("id =" + id.getId());
    Query m = em.createQuery("SELECT (CAST(m.markSectionOne AS UNSIGNED) + CAST(m.markSectionTwo AS UNSIGNED) + CAST(m.markSectionThree AS UNSIGNED) + CAST(m.markSectionFour AS UNSIGNED) + CAST(m.markSectionFive AS UNSIGNED) + CAST(m.markSectionSix AS UNSIGNED) + CAST(m.markSectionSeven AS UNSIGNED) + CAST(m.markSectionEight AS UNSIGNED) + CAST(m.markSectionNine AS UNSIGNED) + CAST(m.markSectionTen AS UNSIGNED) + CAST(m.markSectionEleven AS UNSIGNED) + CAST(m.markSectionTwelve AS UNSIGNED) + CAST(m.markSectionThirteen AS UNSIGNED)) FROM MARKING m WHERE m.id = :id", Double.class);
    m.setParameter("id", id.getId()); // Note the getId()

    Object avg = m.getSingleResult();
    return null; // Do you really want to be returning null here?
}

最佳答案

您的应用程序在那里为您提供了非常有用的错误消息:

java.lang.IllegalArgumentException: You have attempted to set a value of type class sws.entities.Marking for parameter id with expected type of class java.lang.Long from query string

重要的一点是:类 java.lang.Long 的预期类型

您需要的Long 参数包含在您的Marking 对象的id 属性中,因此无需设置Marking 对象本身作为查询参数,设置其id属性:

public String markingAvg(Marking id) {
    System.out.println("id = " + id);
    Query m = em.createQuery("SELECT (m.markSectionOne + m.markSectionTwo + m.markSectionThree + m.markSectionFour + m.markSectionFive + m.markSectionSix + m.markSectionSeven + m.markSectionEight + m.markSectionNine + m.markSectionTen + m.markSectionEleven + m.markSectionTwelve + m.markSectionThirteen) FROM MARKING m WHERE m.id = :id", Double.class);
    m.setParameter("id", id.getId()); // Note the getId()

    Object avg = m.getSingleResult();
    return null; // Do you really want to be returning null here?
}

解决您的第二个问题;您正试图将 VARCHAR 列的内容添加在一起(或者至少这是我对您的意图的假设)。如果需要将这些列相加,则需要将它们转换为支持加法的数据类型。对于每个 VARCHAR 列,您需要执行如下操作:

CAST(COLUMN AS INTEGER)

应用于您的查询,它将变为:

"SELECT (CAST(m.markSectionOne AS INTEGER) + CAST(m.markSectionTwo AS INTEGER) + CAST(m.markSectionThree AS INTEGER) + CAST(m.markSectionFour AS INTEGER) + CAST(m.markSectionFive AS INTEGER) + CAST(m.markSectionSix AS INTEGER) + CAST(m.markSectionSeven AS INTEGER) + CAST(m.markSectionEight AS INTEGER) + CAST(m.markSectionNine AS INTEGER) + CAST(m.markSectionTen AS INTEGER) + CAST(m.markSectionEleven AS INTEGER) + CAST(m.markSectionTwelve AS INTEGER) + CAST(m.markSectionThirteen AS INTEGER)) FROM MARKING m WHERE m.id = :id"

关于这一点的最后一点,我个人不喜欢 SQL 查询的想法,它不仅仅是返回原始数据。数据库不需要知道您需要将所有这些列的值相加,它只需要知道您需要这些值并将它们提供给您。如果是我,我会在 Java 层执行添加,而不是让查询来执行。

关于java - JPA/JPQL 查询错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23176551/

相关文章:

java - 无法从 GPS 检查返回 boolean 值

Mysql 触发器具有多个值

sql - 在 SQL Server 2008 中运行查询时是否需要包含方括号 []?

mysql - 基于时间在数据库中生成事件

java - JDeveloper 与 IntelliJ IDEA

java - 由于 setImageResource(rowItem.getImageId()) 应用程序崩溃

java - 如何在java中使用另一个程序执行cmd命令

php - 如何根据我在 codeigniter session 中拥有的电子邮件返回数据?

php - 如何在其中设置的PHP中编写查询

php - 有没有办法在 SQL 查询中用变量表示列名?