加入两个表并作为一条记录发送

Join two tables and send as one record

假设我们有这样的表:

Table 用户

iduser | password

Table 分数

id | iduser | mark | idtest

Table 测试

idtest | title

查询如下所示:

@GET
@Path("/{id}/marks")
@Produces(MediaType.APPLICATION_JSON)
public Object funkcja(@PathParam("id") Integer iduser) {
    Query query = em.createQuery("select m,t from Marks m, Tests t where m.idusers=:iduser and m.idtest = t.idtests");
    query.setParameter("iduser", id);
    List<Object> results = (List<Object>)query.getResultList();
    return results;
}

我有实体 classes: 标记用户测试

我应该怎么做才能加入表并在 Web 服务上发送 JSON 类型以及如何将 JSON 转换为实体 class 因为我想在 Table查看。 也许还有其他简单的方法? 也许 mapJsonObject?

您似乎有多个问题;我认为您需要将这些分解为单独的问题。

对于 "main" 关于 JPA 和如何加入实体的问题,我会在实体级别而不是查询级别进行。 IE。我想我会有这样的实体 类:

import java.util.Objects;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="Tests")
public class Test {

    @Id
    @Column(name="idtest")
    private int id ;
    private String title ;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public boolean equals(Object other) {
        if (other instanceof Test) {
            return Objects.equals(title, ((Test)other).title);
        } else return false ;
    }

    @Override
    public int hashCode() {
        return Objects.hash(title);
    }
}

然后 Mark 实体可以使用 @ManyToOne 注释来引用实际的 Test object (不是它的 id):

import java.util.Objects;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="Marks")
public class Mark {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id ;

    @ManyToOne
    @JoinColumn(name="idtest")
    private Test test ;

    // You probably don't want a reference to User here, as the User class
    // encapsulates the password, which you don't want to throw back and
    // forward across the network unnecessarily. But if the User class 
    // instead had a user name etc you wanted, you could use the same
    // @ManyToOne technique to reference a User object here if you needed.
    @Column(name="iduser")
    private int userId ;

    private int mark ;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public Test getTest() {
        return test;
    }

    public void setTest(Test test) {
        this.test = test;
    }

    public int getMark() {
        return mark;
    }

    public void setMark(int mark) {
        this.mark = mark;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Mark) {
            Mark other = (Mark)obj ;
            return Objects.equals(userId, other.userId)
                && Objects.equals(test, other.test)
                && mark == other.mark ;
        } else return false ;
    }

    @Override
    public int hashCode() {
        return Objects.hash(userId, test, mark);
    }
}

现在您的查询看起来像

TypedQuery<Mark> query = em.createQuery("select m from Mark m where m.userId=:userid");
query.setParameter("userid", iduser);
List<Mark> results = query.getResultList();

并且列表中的 Mark 个实例已经拥有您需要的所有数据:

for (Mark mark : results) {
    System.out.println(mark.getTest().getTitle() + ": " + mark.getMark());
}

剩下的问题:

假设您的服务器设置了 JAX-RS 实现(例如 Jersey),您显示的代码片段(使用新查询修改)应该生成 JSON 输出。 (您可以使用 Firefox REST 客户端等开发人员工具通过指定适当的 URL 和请求 headers 并查看响应来查看 JSON 输出。)

在客户端 (JavaFX) 端,您可以使用 Jersey 的客户端库(或者可能是 Apache HttpComponent 库)轻松创建 Web 请求,并使用 GSON 或 Jackson 等库来映射 JSON你拿回一个Java的内容在object中显示在TableView

我建议您试试这个,如果您遇到困难,可以询问有关剩余部分的具体问题。