2015-09-10 1 views
0

Удивительно, но я получаю одинаковое значение для разных ограничений в двух последовательных вызовах Критерий.Критерий спящего режима возвращает одинаковое значение для разных ограничений в двух последовательных вызовах

Я использую Hibernate 4.2.20 final. Пожалуйста, обратитесь к моей зависимости от maven.

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.2.20.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>4.2.20.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>5.1.3.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.1-api</artifactId> 
     <version>1.0.0.Final</version> 
    </dependency> 

Мой код DAO:

public List<StockQuote> retrieve(final Date startDate, final Date endDate, final String companyName) 
     throws StartDateAfterEndDateException 
{ 

    Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(StockQuote.class).createAlias("company", "c") 
      .add(Restrictions.eq("c.name", companyName)).add(Restrictions.between("date", startDate, endDate)) 
      .addOrder(Order.asc("date")); 

    return criteria.list(); 

} 

Если приведенный выше код выполняется следующим:

DateTime endDate = new DateTime(2016, 4, 24, 0, 0, 0); 
    List<StockQuote> quotes; 
    quotes = stockService.retrieve(endDate.toDate(), endDate.toDate(), "S&P CNX Nifty", org.technical.analysis.common.Period.DAILY); 
    quotes = stockService.retrieve(endDate.toDate(), endDate.toDate(), "Associated Cements", org.technical.analysis.common.Period.DAILY); 

Тогда оба случая я получаю тот же список StockQuotes. Обратите внимание, что я вызвал мой метод DAO на другое название компании.

@Entity 

@Table (имя = "stockdata") класс StockQuote общественности {

private Company company; 
private Date date; 
private double open; 
private double high; 
private double low; 
private double close; 
private long volume; 

/** 
* Empty constructor 
*/ 
public StockQuote() { 
} 

/** 
* Constructor with arguments 
* 
* @param company The company 
* @param date Date of the quotation 
* @param open Open quote 
* @param high High quote 
* @param low Low quote 
* @param close Close quote 
* @param volume Volume of data 
*/ 
public StockQuote(Company company, Date date, double open, double high, double low, double close, long volume) { 
    this.company = company; 
    this.date = date; 
    this.open = open; 
    this.high = high; 
    this.low = low; 
    this.close = close; 
    this.volume = volume; 
} 


@ManyToOne 
@JoinColumn(name = "companyId") 
public Company getCompany() { 
    return company; 
} 

public void setCompany(Company company) { 
    this.company = company; 
} 

@Id 
@Column(name = "date", nullable = false) 
public Date getDate() { 
    return this.date; 
} 

public void setDate(Date date) { 
    this.date = date; 
} 

@Column(name = "open", nullable = false) 
public double getOpen() { 
    return this.open; 
} 

public void setOpen(double open) { 
    this.open = open; 
} 

@Column(name = "high", nullable = false) 
public double getHigh() { 
    return this.high; 
} 

public void setHigh(double high) { 
    this.high = high; 
} 


@Column(name = "low", nullable = false) 
public double getLow() { 
    return this.low; 
} 

public void setLow(double low) { 
    this.low = low; 
} 

@Column(name = "close", nullable = false) 
public double getClose() { 
    return this.close; 
} 

public void setClose(double close) { 
    this.close = close; 
} 

@Column(name = "volume", nullable = false) 
public long getVolume() { 
    return this.volume; 
} 

public void setVolume(long volume) { 
    this.volume = volume; 
} 

@Override 
public String toString() { 
    return "StockQuote [" + company + ", date=" + date + ", open=" + open 
      + ", high=" + high + ", low=" + low + ", close=" + close + ", volume=" + volume + "]"; 
} 

@Override 
public int hashCode() 
{ 
    final int prime = 31; 
    int result = 1; 
    long temp; 
    temp = Double.doubleToLongBits(close); 
    result = prime * result + (int) (temp^(temp >>> 32)); 
    result = prime * result + ((company == null) ? 0 : company.hashCode()); 
    result = prime * result + ((date == null) ? 0 : date.hashCode()); 
    temp = Double.doubleToLongBits(high); 
    result = prime * result + (int) (temp^(temp >>> 32)); 
    temp = Double.doubleToLongBits(low); 
    result = prime * result + (int) (temp^(temp >>> 32)); 
    temp = Double.doubleToLongBits(open); 
    result = prime * result + (int) (temp^(temp >>> 32)); 
    result = prime * result + (int) (volume^(volume >>> 32)); 
    return result; 
} 

@Override 
public boolean equals(Object obj) 
{ 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    StockQuote other = (StockQuote) obj; 
    DateTime otherDateTime = new DateTime(other.date); 
    DateTime dateTime = new DateTime(date); 
    if (Double.doubleToLongBits(close) != Double.doubleToLongBits(other.close)) 
     return false; 
    if (company == null) 
    { 
     if (other.company != null) 
      return false; 
    } 
    else if (!company.equals(other.company)) 
     return false; 
    if (date == null) 
    { 
     if (other.date != null) 
      return false; 
    } 
    else if (!(dateTime.getDayOfMonth() == otherDateTime.getDayOfMonth() && 
       dateTime.getMonthOfYear() == otherDateTime.getMonthOfYear() && 
       dateTime.getYear() == otherDateTime.getYear())) 
     return false; 
    if (Double.doubleToLongBits(high) != Double.doubleToLongBits(other.high)) 
     return false; 
    if (Double.doubleToLongBits(low) != Double.doubleToLongBits(other.low)) 
     return false; 
    if (Double.doubleToLongBits(open) != Double.doubleToLongBits(other.open)) 
     return false; 
    if (volume != other.volume) 
     return false; 
    return true; 
} 

}

Пожалуйста, помогите мне решить эту проблему.

+1

Возможно, вы используете плохой @Id для StockQuote, можете ли вы опубликовать код StockQuote? –

+0

@Suvonkar: plz поделитесь с нами своим классом StokeQuote .. – Lathy

+0

@NyamiouTheGaleanthrope, StockQuote добавлен код – Suvonkar

ответ

1

После некоторого исследования я обнаружил, что была проблема с @Id в StockQuote в соответствии с первым комментарием. Таким образом, у меня есть добавлен столбец идентификатора в таблице запасов и сделал его основным ключом также обновил класс StockQuote. Теперь это прекрасно.

Смежные вопросы