Java Spring Hibernate HQL, где пункт не работает - PullRequest
0 голосов
/ 07 марта 2020

У меня есть HQL-запрос с JOIN, но предложение where (instrPrice.date BETWEEN: dateFrom AND: dateTo) для присоединенного объекта не работает. Запрос всегда возвращает все записи toolPrice, а не ограничивает результат датами.

NamedQuery

@NamedQuery(name = "findAllPrices", 
        query = "SELECT DISTINCT taPat FROM TaPatternInstrument taPat "
                + "LEFT JOIN FETCH taPat.instrument instr "
                + "LEFT JOIN instr.instrumentPriceList instrPrice "
                + "WHERE taPat.id = :taPatternInstrumentId "
                + "AND instrPrice.date BETWEEN :dateFrom AND :dateTo ")

Служба, которая вызывает запрос

public TaPatternInstrument findAllPrices(int taPatternInstrumentId, LocalDate dateFrom,  LocalDate dateTo) {

   TypedQuery<TaPatternInstrument> typedQuery = createNamedQuery("findAllPrices", 
        TaPatternInstrument.class);
   typedQuery.setParameter("taPatternInstrumentId", taPatternInstrumentId);
   typedQuery.setParameter("dateFrom", dateFrom);
   typedQuery.setParameter("dateTo", dateTo);
   return typedQuery.getSingleResult(); 
}

Entities

public abstract class BaseEntity implements Serializable {

   @Id  
   @Column(name = "id")     
   @GeneratedValue(strategy =
                GenerationType.IDENTITY)
   protected int id; ... 
}

public class TaPatternInstrument extends BaseEntity {

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "instrument_id", nullable = false, foreignKey = @ForeignKey(name = 
            "tapatterninstrument_instrument_fk"))
   private Instrument instrument;

}


public class Instrument extends BaseEntity {

  @OneToMany(mappedBy = "instrument", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  private List<InstrumentPrice> instrumentPriceList;

}

Сгенерировано SQL

SELECT DISTINCT tapatterni0_.id  AS id1_34_0_, 
...
FROM   tapatterninstrument tapatterni0_ 
       LEFT OUTER JOIN instrument instrument1_ 
                    ON tapatterni0_.instrument_id = instrument1_.id 
       LEFT OUTER JOIN instrumentprice instrument2_ 
                    ON instrument1_.id = instrument2_.instrument_id 
WHERE  tapatterni0_.id = ? 
       AND ( instrument2_.date BETWEEN ? AND ? ) 

1 Ответ

0 голосов
/ 14 марта 2020

Решение состоит в том, чтобы добавить FETCH в instrumentPriceList: ВЛЕВО ПОДКЛЮЧИТЬ FETCH instr.instrumentPriceList instrPrice

@NamedQuery(name = "findAllPrices", 
query = "SELECT DISTINCT taPat FROM TaPatternInstrument taPat "
        + "LEFT JOIN FETCH taPat.instrument instr "
        + "LEFT JOIN FETCH instr.instrumentPriceList instrPrice "
        + "LEFT JOIN taPat.taPatternInstrumentPriceList taPatpr "
        + "WHERE taPat.id = :taPatternInstrumentId "
        + "AND instrPrice.date BETWEEN :dateFrom AND :dateTo ")

FETCH заставляет Hibernate немедленно получить Entity (InstrumentPrice) для получения объекта Запрос БД. И, таким образом, предложение where принимается во внимание Без FETCH Entity InstrumentPrice извлекается из БД только при вызове метода getInstrumentPriceList Entity Instrument (выполняется дополнительный вызов БД). При этом дополнительном обращении к БД предложение where больше не учитывается, что позволяет извлечь все записи из Entity instrumentPrice.

...