JPA,NamedQueries奇怪的beaviour,在两个表上使用JOIN
这是我的第一个Java代码。我试图获得一个RESTfull web服务,它返回一个JSON编码的数据库视图 我希望MySQL中的结果(不是json编码的)是通过以下查询获得的:JPA,NamedQueries奇怪的beaviour,在两个表上使用JOIN,jpa,netbeans,join,glassfish,eclipselink,Jpa,Netbeans,Join,Glassfish,Eclipselink,这是我的第一个Java代码。我试图获得一个RESTfull web服务,它返回一个JSON编码的数据库视图 我希望MySQL中的结果(不是json编码的)是通过以下查询获得的: SELECT t0.id, t0.callsign, t0.description, t0.name, t0.noradID, t0.tle, t1.name FROM scl t0 LEFT OUTER JOIN sccommchannel t1 ON t1.id_sc = t0.id 结果是与相关航天器(scl)细
SELECT t0.id, t0.callsign, t0.description, t0.name, t0.noradID, t0.tle, t1.name
FROM scl t0
LEFT OUTER JOIN sccommchannel t1 ON t1.id_sc = t0.id
结果是与相关航天器(scl)细节相关的每个通道(sccommchannel)的一行。
因此,每个航天器都有一个或多个通道的关联
我创建了一个实体类(在netbeans的帮助下),如下所示:
一揽子实体
import java.io.Serializable;
import javax.persistence.Basic;
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.Lob;
import javax.persistence.NamedQuery;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.SecondaryTable;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@Table(name = "scl")
@SecondaryTable(name = "sccommchannel", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "id_sc", referencedColumnName = "id")})
@XmlRootElement
@NamedQuery(name = "Sclc.findAll", query = "SELECT d FROM Scl s, Sccommchannel c LEFT OUTER JOIN c.id_sc d")
public class Sclc implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@NotNull
@JoinColumn
@Column(name = "id", table = "scl")
private Integer id;
@Size(max = 255)
@Column(name = "callsign", table = "scl")
private String callsign;
@Size(max = 100)
@Column(name = "description", table = "scl")
private String description;
@Size(max = 50)
@Column(name = "name", table = "scl")
private String name;
@Size(max = 100)
@Column(name = "noradID", table = "scl")
private String noradID;
@Lob
@Size(max = 2147483647)
@Column(name = "tle", table = "scl")
private String tle;
@Column(name = "name", table = "sccommchannel")
private String ch_name;
public Sclc() {
}
public String getCh_name() {
return ch_name;
}
public void setCh_name(String ch_name) {
this.ch_name = ch_name;
}
public String getCallsign() {
return callsign;
}
public void setCallsign(String callsign) {
this.callsign = callsign;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNoradID() {
return noradID;
}
public void setNoradID(String noradID) {
this.noradID = noradID;
}
public String getTle() {
return tle;
}
public void setTle(String tle) {
this.tle = tle;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Sclc)) {
return false;
}
Sclc other = (Sclc) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "entities.Sclc[ id=" + id + " ]";
}
}
在这段代码中,我通过@PrimaryKeyJoinColumn传递连接参数,这是正确的方法吗
以及相关的RESTfull类:
package service;
import entities.Sclc;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Stateless
@Path("/sclc/all")
public class SclcFacadeREST extends AbstractFacade<Sclc> {
@PersistenceContext(unitName = "GENSO_jsonPU")
private EntityManager em;
public SclcFacadeREST() {
super(Sclc.class);
}
@GET
@Override
@Produces({"application/json"})
public List<Sclc> findAll() {
return super.findAll();
}
@java.lang.Override
protected EntityManager getEntityManager() {
return em;
}
}
Java结果:
1 "CALLSIGN" "sometext" "ISS" "number" "Long_string" "Channel_1"
1 "CALLSIGN" "sometext" "ISS" "number" "Long_string" "Channel_1"
1 "CALLSIGN" "sometext" "ISS" "number" "Long_string" "Channel_1"
作为JPA查询,我已经尝试过:
SELECT s FROM Scl s
SELECT s, c FROM Scl s, Sccommchannel c WHERE s.id = c.id_sc
如果有人能告诉我如何查看从JPA生成的用于调试的MySQL代码,这也会很有用
有可能我犯了一个非常愚蠢的错误。。。
提前感谢,,
弗朗西斯科你的询问毫无意义 从Sclc s、SCCOMM通道c左侧外部连接c.id\U sc d中选择d 您没有提供从s到c的任何连接,因此将获得每个Sccommchannel的所有Sclc 此外,您正在将Sclc映射到这两个表,因此也将sccommchannel映射到sccommchannel类没有任何意义 不知道你想做什么,但也许只是 从Sclc s中选择s
或者修改模型以使其有意义。您的查询没有任何意义 从Sclc s、SCCOMM通道c左侧外部连接c.id\U sc d中选择d 您没有提供从s到c的任何连接,因此将获得每个Sccommchannel的所有Sclc 此外,您正在将Sclc映射到这两个表,因此也将sccommchannel映射到sccommchannel类没有任何意义 不知道你想做什么,但也许只是 从Sclc s中选择s
或者修改您的模型以使其有意义。谢谢James。我没有通过@PrimaryKeyJoinColumn注释进行连接,并在查询中指定c.id\u sc?您认为最好创建两个类,每个表一个,然后创建一个新类,将前两个类连接起来吗?谢谢James。我没有通过@PrimaryKeyJoinColumn注释进行连接,并在查询中指定c.id\u sc?您认为最好创建两个类,每个表一个,然后再创建一个新类来连接前两个类吗?
SELECT s FROM Scl s
SELECT s, c FROM Scl s, Sccommchannel c WHERE s.id = c.id_sc