gpt4 book ai didi

java - 对组合键的一部分进行条件查询

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:54 27 4
gpt4 key购买 nike

我们最近在软件中遇到了一个错误,原因是缺少 @Id 注释:

@Entity
@Table (name ="PATRONQRSPLANS")
//@IdClass(PatronPlan.class) <-- this was missing
public class Balance {

@Transient
private String kind;

@Transient
private String planName;

@Transient
private PlanCategory planCategory;

@Id
@Column(name="PATRONID")
private int patronId;

//@Id <--- and this was missing
@Column(name="PLANID")
private int planId;

@Column(name="BALANCE")
private int balance;

@Column(name="ENDDATE")
private Date expirationDate;

public Balance() {
this.kind = "balance";
}

public Balance(int balance, int planId, Date expirationDate) {
this.balance = balance;
this.planId = planId;
this.expirationDate = expirationDate;
this.kind = "balance";
}

public int getPatronId() {
return patronId;
}

public void setPatronId(int patronId) {
this.patronId = patronId;
}

public int getBalance() {
return balance;
}

public void setBalance(int balance) {
this.balance = balance;
}

public int getPlanId() {
return planId;
}

public void setPlanId(int planId) {
this.planId = planId;
}

public String getPlanName() {
return planName;
}

public void setPlanName(String planName) {
this.planName = planName;
}

public String getKind() {
return kind;
}

public void setKind(String kind) {
this.kind = kind;
}

public Date getExpirationDate() {
return expirationDate;
}

public void setExpirationDate(Date expirationDate) {
this.expirationDate = expirationDate;
}

public PlanCategory getPlanCategory() {
return planCategory;
}

public void setPlanCategory(PlanCategory planCategory) {
this.planCategory = planCategory;
}
}

问题是该表对 planId 和 patantId 都有主键约束,所以我需要一个复合键。对于具有 2 个不同计划的订阅者,下面的查询(没有上面注释掉的注释)将返回同一计划的 2 个副本,而不是 2 个不同的副本。

public List<Balance> getBalancesByPatronId(int patronId) {
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Balance> query = builder.createQuery(Balance.class);

Root<Balance> s = query.from(Balance.class);
query.select(s);
query.where(builder.equal(s.get("patronId"), patronId));

return entityManager.createQuery(query).getResultList();
}

为了解决这个问题,我添加了一个 @Id@IdClass 注释(如上面注释的那样),并创建了此类:

public class PatronPlan implements Serializable {

private static final long serialVersionUID = -3518083815234439123L;

@Id
@Column(name="PATRONID")
private int patronId;

@Id
@Column(name="PLANID")
private int planId;

public int getPatronId() {
return patronId;
}

public void setPatronId(int patronId) {
this.patronId = patronId;
}

public int getPlanId() {
return planId;
}

public void setPlanId(int planId) {
this.planId = planId;
}

@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (!this.getClass().isAssignableFrom(obj.getClass())) return false;

PatronPlan other = (PatronPlan) obj;
return Objects.equals(patronId, other.getPatronId()) && Objects.equals(planId, other.getPlanId());
}

@Override
public int hashCode() {
return Objects.hash(patronId, planId);
}

}

但是现在我在语句的标准查询中收到 NullPointerExceptions.get("patronId"),因为 patronId 没有显示为声明的属性,尽管它似乎显示在 id 信息中。

我的组合键设置是否正确以及如何使用条件 API 查询组合键的一部分?

如果上面还不清楚,目标是能够获取具有给定 patronId 的所有 Balance 对象,即使 patronId 只是复合键的一部分。

最佳答案

我不确定这是否正确,但它似乎有效。它是否正确?我对 hibernate 的了解有限。

public List<Balance> getBalancesByPatronId(int patronId) {
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Balance> query = builder.createQuery(Balance.class);

Metamodel metaModel = getEntityManager().getMetamodel();

SingularAttribute<Balance, Integer> patronIdAttr =
(SingularAttribute<Balance, Integer>) metaModel.entity(Balance.class)
.getIdClassAttributes().toArray()[0];

Root<Balance> s = query.from(Balance.class);
query.select(s);
query.where(builder.equal(s.get(patronIdAttr), patronId));

return entityManager.createQuery(query).getResultList();
}

关于java - 对组合键的一部分进行条件查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com