Hibernate Criteria возвращает одно и то же значение для разных ограничений в двух последовательных вызовах

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

Я использую финальную версию Hibernate 4.2.20. Пожалуйста, обратитесь к моей зависимости 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(name = "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;
}

}

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


person Suvonkar    schedule 10.09.2015    source источник
comment
Вероятно, вы используете неправильный @Id для StockQuote. Можете ли вы опубликовать код StockQuote?   -  person Nyamiou The Galeanthrope    schedule 10.09.2015
comment
@Suvonkar: пожалуйста, поделитесь с нами своим классом StokeQuote..   -  person Lathy    schedule 10.09.2015
comment
@NyamiouTheGaleanthrope, добавлен код StockQuote   -  person Suvonkar    schedule 10.09.2015
comment
@Lathy, добавлен код StockQuote   -  person Suvonkar    schedule 10.09.2015
comment
@Suvonkar Вы уверены, что вызываете тот же метод stockService.retrieve, тело которого вы разместили в своем вопросе? Поскольку тело метода retrieve, которое вы указали, не имеет аргумента типа org.technical.analysis.common.Period.DAILY в качестве последнего аргумента! У него всего 3 аргумента.   -  person STaefi    schedule 10.09.2015
comment
@STaefi, да, я вызываю метод службы, и этот метод службы вызывает указанный выше код DAO.   -  person Suvonkar    schedule 10.09.2015
comment
Откуда вы знаете, что в обоих случаях извлекается один и тот же список StockQuotes?   -  person Aleksandr M    schedule 10.09.2015
comment
@AleksandrM, путем отладки и проверки StockQuote.   -  person Suvonkar    schedule 10.09.2015
comment
Попробуйте присвоить их другим переменным и снова отладить.   -  person Aleksandr M    schedule 10.09.2015
comment
@АлександрМ, тот же результат. :(   -  person Suvonkar    schedule 10.09.2015
comment
Покажите свой сервисный retrieve метод.   -  person Aleksandr M    schedule 10.09.2015
comment
@AleksandrM public List‹StockQuote› извлечение (конечная дата startDate, конечная дата endDate, конечная строка companyName, конечный период Period) выдает StartDateAfterEndDateException, PeriodIntervalMismatchException { List‹StockQuote› quotes = stockDao.retrieve(modifiedStartDate, модифицированныйEndDate, companyName); }   -  person Suvonkar    schedule 10.09.2015


Ответы (1)


После некоторых исследований я обнаружил, что существует проблема с @Id в StockQuote в соответствии с первым комментарием. Поэтому я добавил столбец id в таблицу биржевых данных и сделал его первичным ключом, а также обновил класс StockQuote. Сейчас работает нормально.

person Suvonkar    schedule 10.09.2015