【发布时间】:2016-12-03 22:57:26
【问题描述】:
我编写了一个 Java EE 应用程序来转换货币。用户输入要转换的值、“from”货币和“to”货币,从数据库表中检索转换率。
! [Netbeans 中的表格片段]https://s16.postimg.org/8m242gyyd/Screen_Shot_2016_12_03_at_23_45_23.png
我的货币控制器有以下代码:
public double convertTo(double value, String fromCur, String toCur) {
TypedQuery<Rate> query = em.createQuery(""
+ "SELECT c FROM Rate c WHERE c.fromCur = 'BRA' AND c.toCur = 'EUR'", Rate.class);
query.setParameter("tocurrency", toCur);
query.setParameter("fromcurrency", fromCur);
Rate result = query.getSingleResult();
if (result == null) {
throw new EntityNotFoundException("Can't find rate");
}
return value * result.getValue();
}
例如,我的目标是获取从“BRA”到“EUR”的汇率并计算转换后的金额并返回。当我运行应用程序时,我得到了异常:
getsinglerresult() 没有检索到任何实体
必须有一种更简单的方法来从数据库中检索速率以使用实体管理器计算此转换,但我找不到合适的查询方法或 JPA 解决方案。有什么建议吗?
java实体Rate.java的代码如下:
package currency.model;
import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
*
* @author teowey
*/
@Entity
public class Rate implements ConversionDTO, Serializable {
@Id
@GeneratedValue
private Integer conversionid;
private double rate;
private BigDecimal value;
private String fromCur;
private String toCur;
/**
* Creates a new instance of Account
*/
public Rate() {
}
@Override
public Integer getConversionId() {
return conversionid;
}
public void setConversionId(Integer conversionid) {
this.conversionid = conversionid;
}
@Override
public BigDecimal getValue() {
return value;
}
public void setRate(double rate) {
this.rate = rate;
}
public double getRate(String conversion) {
return rate;
}
public String getFromCur() {
return fromCur;
}
public void setFromCur(String from) {
this.fromCur = from;
}
public String getToCur() {
return toCur;
}
public void setToCur(String to) {
this.toCur = to;
}
}
【问题讨论】:
-
如果你得到这个异常,它只是意味着你正在寻找的行不存在。也许您正在查询不同的表或架构。或者您可能没有提交对数据库所做的更改。
-
问题不在于数据库,我正确配置了所有内容,您可以看到屏幕截图的第一行有一个 fromcurrency BRA 和 to currency EUR 的表。我的问题是从角色获取数据并将其放入实体对象(Rate)中以将其用作方法中的值。我使用的 JPQL 查询不正确,我很难理解要使用哪种查询和实体管理器方法。
-
您没有发布实体的代码,因此很难找到那里的错误。您还将参数传递给您的查询,尽管它没有任何参数。但是如果查询无效,你会得到另一个异常。您得到的异常清楚地表明查询已执行但未返回任何内容。
-
这里是实体代码:[link] (github.com/teowey/currency-converter/blob/master/src/java/…)。
-
代码必须在问题本身中。不在github上。