我有一个表,比如说,仪表,ID、State和User_ID作为列。
所以我有这个JPA查询来返回所有带有匹配User_ID的仪器记录。
query = manager.createQuery("SELECT instrument from Instrument instrument
where instrument.User_ID=:User_ID",Instrument.class);
query.setParameter("User_ID", User_ID);
List<Instrument> instruments= query.getResultList();
for(Instrument instrument:instruments){
System.out.println("Instrument ID "+instrument.getID());
// using sysout as it is not prod code yet
}
它只返回第一条记录,重复次数与有匹配记录的次数一样多。
11:13:01,703 INFO [stdout] (http-/127.0.0.1:8080-1) Instrument ID 1
11:13:01,704 INFO [stdout] (http-/127.0.0.1:8080-1) Instrument ID 1
11:13:01,704 INFO [stdout] (http-/127.0.0.1:8080-1) Instrument ID 1
我有三张Db格式的唱片,仪器编号是1、2和3
我在hibernate上启用了ShowSQL查询,查询直接在数据库上运行良好,并返回不同的记录。
Hibernate查询:
select instrumentjdo0_.User_ID as member_U1_0_, instrumentjdo0_.ID as ID2_0_,
instrumentjdo0_.state as state4_0_ from instrument instrumentjdo0_ where instrumentjdo0_.User_ID=?
工具实体
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "instrument")
public class Instrument{
@Id
@Column(name="User_ID", length=9, unique=true, nullable=false)
String user_ID;
@Column(name="ID",nullable=false)
String ID;
@Column(name="state",nullable=false)
String state;
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getUserID() {
return user_ID;
}
public void setUserID(String userID) {
this.user_ID = userID;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
不知道我错过了什么。
@Id列的问题,如果我们仔细检查,@Id列的值对于所有行都是相同的。因此hibernate/JPA无法获取不同的记录,它只获取带有此@Id的第一条记录,并返回重复的记录。
解决方案-将@IdClass与导致唯一行而不是重复行的列一起使用。
我也面临过同样的问题。对于联系表,我只将firstname
列标记为@Id
。表有多个行具有相同的firstname
,因为具有相同firstname
的第一行记录在整个结果集中被复制。为了解决这个问题,我做了IdClass
,名字和姓氏作为id属性,并在我的bean中作为id类导入。因为firstname
和lastname
一起形成唯一的组合,它解决了我的问题。
Idclass
如下
public class ContactKey implements Serializable{
protected String firstName;
protected String lastName;
public boolean equals(final Object inObject) {
if (null != inObject) {
if (inObject.getClass().equals(this.getClass())) {
CqCamAdminKey siteKey = (CqCamAdminKey) inObject;
return (null != this.getFirstName() && this.getFirstName().equals(siteKey.getFirstName()) && null != this.getLastName() && this.getLastName().equals(siteKey.getLastName()));
}
}
return super.equals(inObject);
}
public int hashCode() {
if (this.getFirstName() != null && this.getLastName() != null) {
return this.getFirstName().hashCode() + this.getLastName().hashCode();
}
return super.hashCode();
}
}
bean类如下所示
@IdClass(contactKey.class)
public abstract class CqCamAdminDataBean implements DataModelConstants{
private static final long serialVersionUID = 7686374823515894764L;
@Id
@JsonIgnore
@XmlTransient
@Column(name = FIRST_NAME)
protected String firstName;
@Id
@JsonIgnore
@Column(name = LAST_NAME)
protected String lastName;
}
问题是仪器实体中的错误列为其分配了@ID
属性。
我从User\u ID
中删除了它,并将它添加到ID
中,它工作得很好。
问题内容: 我有一个表,例如,具有ID,State和User_ID的Instrument作为列。 因此,我有这个JPA查询来返回具有匹配的User_ID的所有仪器记录。 它仅返回第一个记录,重复的次数与匹配记录的次数相同。 我在Db中有3条记录,仪器ID为1,2和3 我在hibernate状态下启用了show sql查询,该查询直接在数据库上运行良好,并返回了不同的记录。 hibernate查询:
我在实体之间有一对多的关系。执行此JPQL查询时: 从父项选择父项加入父项。孩子在哪里。。。 当一位家长有两个孩子时,我会得到重复的记录,当一位家长有一个孩子时,我只会得到一条记录,当没有孩子时,我会得到一条记录(如果没有孩子,我就没有记录)。请注意,SQL数据库中没有重复的父数据库。 实体声明如下: 为了简洁起见,我省略了很多代码,但这应该会让你对我要做的事情有一个清晰的认识。请注意,关系是在父
问题内容: 如果返回0行,那么我需要。是否可以在带有条件语句的单个MySQL查询中执行此操作? 编辑: 所有答案均有效,但前提是两个查询均从同一表(或具有相同列数的表)中选择。如果第二个查询应用于具有联接的其他表上怎么办? 让我写下我的查询以使问题更清楚: 第一: 如果第一个结果为空,则: 第二名: 如果返回第一个查询,我将使用第一个查询的行,否则将使用第二个查询。 问题答案: 从我刚刚进行的快速
我购买了一张桌子,DDL为: Purchase表与purchaseproduct有一对多关系,purchaseproduct的DDL为: 以下是我的POJO: 购买:@Entity@Table(name=“Purchase”)@Access(AccessType.Property)公共类购买{private LongProperty IDPurchase;private StringPropert
问题内容: 在hibernate状态下,我可以执行以下操作 现在,如果我想获取int和String怎么办? 现在列表的结构是什么? 问题答案: 这可以。您唯一需要了解的是它将返回如下列表:
我刚开始冬眠。我有两张桌子,有一对多的关系。有两个表格: 这是一个父类,它与图像表有一对多关系 现在我想使用父类的id(即:pashminaId)从类中选择一个 如: 选择IMAGE_NAMETBL_IMAGEPASHMINA_ID='some_digit'; 我怎么能在图像类中传递pashminaId,因为没有它只有一个父类的对象创建。 那么,我如何在Hibernate中实现这一点? 谢谢!希望