2015-06-08 45 views
0

我试图创建一个查询,我可以通过某种连接表从用户获取项目。当我尝试这个时,我得到一个Nullpointer异常,但我不明白为什么;使用连接表获取实体GAE

这些都是我的班
项目

@Entity 
public class Project { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Key projectId; 
private String projectName; 
private User projectLeader; 
private ArrayList<Task> tasks; 

public Project(){ 
    tasks = new ArrayList<Task>(); 
} 

public String getProjectName() { 
    return projectName; 
} 

public void setProjectName(String projectName) { 
    this.projectName = projectName; 
} 

public Key getProjectId() { 
    return projectId; 
} 

public void setProjectId(Key projectId) { 
    this.projectId = projectId; 
} 

public Project(User pLeader){ 
    tasks = new ArrayList<Task>(); 
} 

public User getProjectLeader() { 
    return projectLeader; 
} 

public void setProjectLeader(User projectLeader) { 
    this.projectLeader = projectLeader; 
} 

public ArrayList<Task> getTasks() { 
    return tasks; 
} 

public void setTasks(ArrayList<Task> tasks) { 
    this.tasks = tasks; 
} 

public void addTask(Task newTask){ 
    tasks.add(newTask); 
} 

public void removeTask(Task removeableTask){ 
    tasks.remove(removeableTask); 
} 
} 

ProjectUser

@Entity 
public class ProjectUser { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public Key projectUserId; 
Key user; 
Key project; 

public ProjectUser(Key u, Key p){ 
    this.user = u; 
    this.project = p; 
} 

public Key getProjectUserId() { 
    return projectUserId; 
} 

public void setProjectUserId(Key projectUserId) { 
    this.projectUserId = projectUserId; 
    System.out.println(""); 
} 

public Key getUser() { 
    return user; 
} 

public void setUser(Key user) { 
    this.user = user; 
} 

public Key getProject() { 
    return project; 
} 

public void setProject(Key project) { 
    this.project = project; 
} 
} 

在我的数据存储

这些记录对于项目用户 ProjectUser Record

对于项目 Project Record

对于用户 enter image description here

正如你可以在projectuser记录看到有链接到现有用户的项目。我试图让下面的方法的项目,但后来我在这行得到空指针:List<Project> userProjects = q.getResultList();

public List<Project> getUserProjects(User u) { 
    EntityManager em = EMFService.get().createEntityManager(); 
    Query q = em.createQuery("SELECT p FROM Project p, ProjectUser pu WHERE pu.user = :User AND p.projectId = pu.project"); 
    q.setParameter("User", u.getUserId()); 
    List<Project> userProjects = q.getResultList(); 
    return userProjects; 
} 

所以我的问题是:为什么我会得到一个空指针,我能做些什么来解决这个问题?

感谢提前:)

+0

我不熟悉JPA(1或2?),无论如何....你不需要在创建它之后运行查询吗? – Patrice

+0

@Patrice它是JPA 2.当你执行'q.getResultList()'查询运行。我认为实体经理会照顾这一点,但我不确定。本主题相当新颖:) –

+0

您是否阅读了[docs](https://cloud.google.com/appengine/docs/java/datastore/jpa/overview-dn2),列出了Datastore不支持的JPA 2的功能?就个人而言,如果您想充分利用数据存储,我建议不要使用JPA。 – tx802

回答

1

谷歌/ GAE数据存储不是一个关系数据库,并且不支持加入的概念。尽管您可以使用JPA的一部分来处理数据存储,但与加入有关的任何JPA部分都不起作用。 您可能想要查看Objectify,它专门为GAE数据存储构建,并允许您根据实际的数据模型进行编码。

+0

谢谢你的回复。我会考虑客观化,我认为这会让事情变得更容易,但为什么我会得到一个空指针?当你只从一个表中选择''时,它真的是一个连接吗? –

+0

您示例中的查询包含三种,所以是 - 这是一个连接。数据存储查询可以来自单一种类,也可以来自祖先查询(不按种类过滤)。 – Gabriel