JPQL: The state field path cannot be resolved to a valid type

*爱你&永不变心* 提交于 2020-01-01 05:11:05

问题


I can't make this query work:

Query query = eManager.createQuery("select c FROM News c WHERE c.NEWSID = :id",News.class);
        return (News)query.setParameter("id", newsId).getSingleResult();

and I got this exception:

Exception Description: Problem compiling [select c FROM News c WHERE c.NEWSID = :id]. 
[27, 35] The state field path 'c.NEWSID' cannot be resolved to a valid type.] with root cause
Local Exception Stack: 
Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Problem compiling [select c FROM News c WHERE c.NEWSID = :id]. 

Why does it happen? :id and named parameter are identical

EDIT: my entity class

@Entity
@Table(name="NEWS")
public class News implements Serializable{

    @Id 
    @SequenceGenerator(name = "news_seq_gen", sequenceName = "news_seq")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "news_seq_gen")
    private int newsId;
    private String newsTitle;
    private String newsBrief;
    private String newsContent;
    private Date newsDate;
    @Transient
    private boolean selected=false;

//constructor and getters and setters 

回答1:


That happens because News entity does not have persistent attribute named NEWSID. Names of the persistent attributes are case sensitive in JPQL queries and those should be written with exactly same case as they appear in entity.

Because entity have persistent attribute named newsId, that should also be used in query instead of NEWSID:

select c FROM News c WHERE c.newsId = :id



回答2:


entity have persistent attribute named newsId.but in query you have used NEWSID . try with this

select c FROM News c WHERE c.newsId = :id



回答3:


My entity is:

@Entity
@Table(name = "TBL_PERSON_INFO")
public class Person implements Serializable {
    @Id
    @Column(name = "ID", nullable = false)
    private Integer id;

    @Column(name = "USER_ID", nullable = false)
    private Integer user_id;
    .
    .
    .
}

my query is (JPQL):

String queryName = "from Person p where p.user_id = :user_id";

so I use it like this:

        javax.persistence.Query query = em.createQuery(queryName);
        query.setParameter("user_id", userId);

        try {
            obj = query.getSingleResult();
        }
        catch (javax.persistence.NoResultException nre) {
            logger.error("javax.persistence.NoResultException: " + nre.getMessage());
        }
        catch (javax.persistence.NonUniqueResultException nure) {
            logger.error("javax.persistence.NonUniqueResultException: " + nure.getMessage());
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        if (obj == null) {
            System.out.println("obj is null!");
            return null;
        }

        Person person = (Person) obj;

It's work ;-)



来源:https://stackoverflow.com/questions/20056847/jpql-the-state-field-path-cannot-be-resolved-to-a-valid-type

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!