2012-05-15 1 views
0

Этот JPQL работал, но потом он сломался без причины. Теперь я получаю это странное исключение:Почему мой 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; 
} 

Не могли бы вы помочь мне исправить эту ошибку?

ответ

1

Кажется, вы звоните getRegionsByLandkod со строкой вместо объекта LandKod. Проверьте, используете ли вы этот запрос, если параметр правильный.

+0

Спасибо за ответ. Я мог бы исправить это и заставить его работать, перейдя к следующему утверждению: «SELECT r FROM Region r WHERE r.landKod.landKod =: landKod', так как мой коллега сделал обновления для классов Region и LandKod. –

2

Проблема эта линия:

public List<Region> getRegionsByLandkod(String landKod) { 

Это должно быть либо это:

public List<Region> getRegionsByLandkod(LandKod landKod) { 

или вы должны быть преобразования строки в LandKod и используя что в качестве параметра запроса.

(Или вы можете изменить класс Region, чтобы сделать тип String, атрибута landKod в.)

 Смежные вопросы

  • Нет связанных вопросов^_^