gpt4 book ai didi

java - 当我使用 @IdClass LinkedHashSet 时包含重复的项目

转载 作者:行者123 更新时间:2023-11-30 04:52:00 24 4
gpt4 key购买 nike

我的任务是准备一个报价搜索屏幕。我已经提到了Oracle View 创建报价模型。由于 View 表中没有 id 列,因此我更喜欢通过 quoteId.class 使用 @IdClass 注释来使用复合 id。我在两个模型上重写了 hashCode 和 equals 方法。 quoteId equals & hashcode 返回所有字段的组合,而 quote hashcode & equals 只是比较模型中的 this.quoteNo 字段。

报价型号:

@Override
public int hashCode()
{
return new HashCodeBuilder(17,37)
.append(quoteNo)
.toHashCode();
}

/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
final quoteModel other = (quoteModel ) obj;
return new EqualsBuilder().appendSuper(super.equals(other))
.append(quoteNo, other.quoteNo).isEquals();
}

当我需要独特的元素时,我只需通过以下方式访问:

uniqueQuoteResults = new ArrayList<Quote>(
new LinkedHashSet<Quote>(fullQuoteResults));

但是当我开始使用 idClass 时,我的 linkedHashSet 拥有所有项目,甚至它们的报价编号都是相同的。我是否缺少任何其他实现来通过引用无字段(可比较、比较器)来证明每个项目的唯一性?如果我跟踪 uniqueQuoteResult 列表项值,所有这些值都具有相同的报价编号。

编辑注意:我已经改变了使用 apache 库 HashCodeBuilder 和 EqualsBuilder 支持的方式,但问题仍然相同。我担心 idClass hashcode 对 linkedhashset 变得有效

最佳答案

使用模型中的以下代码,您可以测试 this.quoteNo 与 obj.quoteNo 相同的实例:

@Override
public boolean equals(Object obj)
{
// TODO Auto-generated method stub
return this.quoteNo == ((EprocAwquoteV) obj).quoteNo;
}

结果是,如果 quoteNo 不是同一个对象,则两个单独构造 IdClass 实例的实例将被视为不相等。我猜你想用类似的东西来测试 quoteNo 的相等性:

this.quoteNo.equals(other.quoteNo);

模型中 equals 的当前实现还存在一些其他问题(例如它可能抛出 ClassCastException)。基本原理可参见:Object.equalsOverriding the java equals() method quirk 。另外,对于 Hibernate,重要的是要记住,您不应该测试类是否相同,而应使用 instanceof 代替(因为有代理类)。关于为实体编写 equals&hascode 的一些说明可以在 Hibernate documentation 中找到。 .

编辑:您当前的方法不起作用,因为

 return new EqualsBuilder().appendSuper(super.equals(other))

将其归结为Object.equals。如果您没有具有有意义的 equals 实现的父类(super class)。我不完全确定我是否正确理解您的情况,所以也许您可以看一下以下工作示例并找出差异在哪里:

public class QuoteId implements Serializable {
private int id1;
private int id2;

public QuoteId() {}

//This equals does not matter when we build LinkedHashSet
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
QuoteId other = (QuoteId) o;
return id1 == other.id1 && id2 == other.id2;
}

public int hashCode() {
return 31 * id1 + id2;
}
}

@Entity
@IdClass(QuoteId.class)
public class Quote {
@Id private int id1;
@Id private int id2;
String value;

public Quote() {
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Quote other = (Quote) o;
return id1 == other.id1 && id2 == other.id2;
}

@Override
public int hashCode() { return 31 * id1 + id2;}

//get&set for id1, id2, and value are omitted
}


tx.begin();
em.persist(new Quote(1, 1, "val"));
em.persist(new Quote(1, 2, "val"));
tx.commit();

TypedQuery<Quote> query = em.createQuery("SELECT q FROM Quote q", Quote.class);
List<Quote> twoQuotes = query.getResultList();//both

//duplicating (size=4) result for sake of test;
List<Quote> fullQuoteResults = new ArrayList<Quote>();
fullQuoteResults.addAll(twoQuotes);
fullQuoteResults.addAll(twoQuotes);

//will have same elements as in twoQuotes:
List<Quote> uniqueQuoteResults = new ArrayList<Quote>(
new LinkedHashSet<Quote>(fullQuoteResults));

关于java - 当我使用 @IdClass LinkedHashSet 时包含重复的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9650726/

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