JPA PersistenceException:无法解析类名

时间:2015-06-06 10:00:01

标签: java google-app-engine jpa google-cloud-datastore

我试图通过GAE的项目名称创建一个方法来获取项目,但是我收到了以下错误。

javax.persistence.PersistenceException: Class name TestProject could not be resolved

我在if语句开始的行上的以下代码段中出现此错误

public Project getProjectByProjectName(String projectName){
    EntityManager em = EMFService.get().createEntityManager();
    Query q = em.createQuery("SELECT p FROM Project p WHERE p.projectName = " + projectName);       
    Project p = null;
    if(q.getResultList().size() != 0){
        p = (Project) q.getSingleResult();
    }
    return p;
}

我调用了这样的方法:getProjectByProjectName("TestProject");

为什么java认为testproject是一个类?查询错了吗?

提前致谢:)

1 个答案:

答案 0 :(得分:4)

如果项目名称为TestProject,则查询应为

SELECT p FROM Project p WHERE p.projectName = 'TestProject'

而不是,正如你所做的那样

SELECT p FROM Project p WHERE p.projectName = TestProject

如果您停止使用字符串连接将参数传递给查询,那么所有这些都不会发生。这使您的代码容易受到JPQL injection attacks的攻击。一旦项目名称包含单引号,它就会中断。使用参数:

Query q = em.createQuery("SELECT p FROM Project p WHERE p.projectName = :name");
q.setParameter("name", projectName);