加入两个表并作为一条记录发送
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查看。
也许还有其他简单的方法?
也许 map 或 JsonObject?
您似乎有多个问题;我认为您需要将这些分解为单独的问题。
对于 "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
。
我建议您试试这个,如果您遇到困难,可以询问有关剩余部分的具体问题。
假设我们有这样的表:
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查看。 也许还有其他简单的方法? 也许 map 或 JsonObject?
您似乎有多个问题;我认为您需要将这些分解为单独的问题。
对于 "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
。
我建议您试试这个,如果您遇到困难,可以询问有关剩余部分的具体问题。