这个JPQL曾经工作过,但后来没有任何理由破坏。我现在得到这个奇怪的例外:
java.lang.IllegalArgumentException: Parameter "Parameter<LandKod>('landKod')" declared in "SELECT r FROM Region r WHERE r.landKod = :landKod" is set to value of "US" of type "java.lang.String", but this parameter is bound to a field of type "se.prv.pandora.arendeprocess.entity.LandKod".
这似乎表明我的代码中名称为landKod存在某种名称冲突。这是来源:
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity(name = "Region")
@Table(name="TP197_REGION")
@NamedQueries({
@NamedQuery(name = "getAllValidRegions", query = "SELECT r FROM Region r WHERE r.histKod = 'A'"),
@NamedQuery(name = "getRegionsByLandkod", query = "SELECT r FROM Region r WHERE r.landKod = :landKod")
})
public class Region implements Serializable {
@Id
private int regionId;
@ManyToOne
@JoinColumn(name="landKod", referencedColumnName="landKod")
private LandKod landKod ;
private String histKod ;
private String regionForkort;
private String regionRubrik;
private String regionBeskr;
public Region() {
super();
}
public int getRegionId() {
return regionId;
}
public void setRegionId(int regionId) {
this.regionId = regionId;
}
public String getRegionForkort() {
return regionForkort;
}
public void setRegionForkort(String regionForkort) {
this.regionForkort = regionForkort;
}
public String getRegionRubrik() {
return regionRubrik;
}
public void setRegionRubrik(String regionRubrik) {
this.regionRubrik = regionRubrik;
}
public String getRegionBeskr() {
return regionBeskr;
}
public void setRegionBeskr(String regionBeskr) {
this.regionBeskr = regionBeskr;
}
public String getHistKod() {
return histKod;
}
public void setHistKod(String histKod) {
this.histKod = histKod;
}
public String getRegionFormatted() {
if(regionForkort!=null && regionForkort.length()>0) {
return regionForkort + " " + regionRubrik;
} else {
return regionRubrik;
}
}
public LandKod getLandKod() {
return landKod;
}
public void setLandKod(LandKod landKod) {
this.landKod = landKod;
}
}
这是方法实现,它允许字符串作为参数:
@Override
public List<Region> getRegionsByLandkod(String landKod) {
List<Region> regionsList = null;
try {
Query query = em.createNamedQuery("getRegionsByLandkod");
query.setParameter("landKod", landKod);
regionsList = (List<Region>) query.getResultList();
} catch(Exception e){
logger.info("Kunde inte hitta någon region med landkod: "+landKod, e);
}
return regionsList;
}
你能帮我解决这个错误吗?
答案 0 :(得分:2)
问题在于这一行:
public List<Region> getRegionsByLandkod(String landKod) {
它应该是这样的:
public List<Region> getRegionsByLandkod(LandKod landKod) {
或者您应该将String转换为LandKod并使用 作为查询参数。
(或者您可以更改Region类以使landKod属性的类型为String。)
答案 1 :(得分:1)
您似乎正在使用String而不是getRegionsByLandkod
对象调用LandKod
。
如果参数正确,请验证您使用此查询的位置。