【问题标题】:Getting entity with a join table GAE使用连接表 GAE 获取实体
【发布时间】:2023-03-16 03:45:01
【问题描述】:

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

这些是我的课程
项目

@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);
}
}

项目用户

@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 记录中看到的,有一个项目链接到现有用户。我尝试使用以下方法获取项目,但随后在这一行得到空指针:List&lt;Project&gt; 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;
}

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

提前致谢:)

【问题讨论】:

  • 我不熟悉 JPA(1 或 2?),无论如何......你不需要在创建后运行查询吗?
  • @Patrice 这是 JPA 2。当您执行 q.getResultList() 时,查询运行。我认为实体经理会处理这个问题,但我不确定。这个话题很新:)
  • 您是否阅读过docs,其中列出了 Datastore 不支持的 JPA 2 功能?如果您想充分利用 Datastore,我个人建议不要使用 JPA。

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


【解决方案1】:

Google/GAE Datastore 不是关系型数据库,不支持联接的概念。尽管您可以使用 JPA 的一部分来处理数据存储,但与加入有关的任何 JPA 部分都将不起作用。 你可能想看看Objectify,它是专门为 GAE Datastore 构建的,它可以让你根据实际的数据模型进行编码。

【讨论】:

  • 感谢您的回复。我会研究objectify,我认为这会更容易,但为什么我会得到一个空指针?当您只从 1 个表中 select 时,它真的是一个联接吗?
  • 您的示例中的查询包含三种,所以是的 - 这是一个连接。数据存储区查询可以来自单一种类,也可以来自祖先查询(不按种类过滤)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多