我正在尝试从数据库中检索一组结果(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/