【问题标题】:Why is my JPQL not working?为什么我的 JPQL 不工作?
【发布时间】:2012-05-15 10:02:12
【问题描述】:

这个 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;
}

你能帮我解决这个错误吗?

【问题讨论】:

    标签: java jakarta-ee websphere jpql rad


    【解决方案1】:

    问题出在这一行:

       public List<Region> getRegionsByLandkod(String landKod) {
    

    应该是这样的:

       public List<Region> getRegionsByLandkod(LandKod landKod) {
    

    或者您应该将字符串转换为 LandKod 并使用 that 作为查询参数。

    (或者您可以更改 Region 类以使landKod 属性的类型为字符串。)

    【讨论】:

      【解决方案2】:

      您似乎使用字符串而不是 LandKod 对象调用 getRegionsByLandkod。 如果参数正确,请验证您使用此查询的位置。

      【讨论】:

      • 感谢您的回答。我可以通过更改为以下语句而不是 SELECT r FROM Region r WHERE r.landKod.landKod = :landKod 来修复它并使其工作,因为我的同事已经对 Region 和 LandKod 类进行了更新。
      猜你喜欢
      • 2015-05-19
      • 2016-05-05
      • 2014-05-17
      • 2017-09-20
      • 2012-04-14
      • 2016-09-15
      • 2012-02-14
      • 2012-08-10
      • 2013-07-27
      相关资源
      最近更新 更多