Spring Data JPA @Query - выберите максимум - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь написать запрос, используя select max & where с @Query

Следующее не будет работать, как я могу это исправить?

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
interface IntermediateInvoiceRepository extends JpaRepository<Invoice, String> {

@Query("SELECT max(i.sequence) " +
        "FROM Invoice as i " +
        "WHERE i.fleetId = :fleetId" +
        "   AND i.sequence IS NOT NULL")
Long findMaxSequence(@Param("fleetId") String fleetId);

}

Я столкнулся с другим ответом, но он явно использует менеджер сущностей, но он не тот же

Как мне написать запрос MAX с предложением where в JPA 2.0?

ошибка:

2018-09-14T09:27:57,180Z  [main] ERROR o.s.boot.SpringApplication     - Application startup failed
org.springframework.data.mapping.PropertyReferenceException: No property findMaxSequence found for type Invoice!

класс счета (упрощенный для краткости):

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "invoices", indexes = {
        @Index(name = "IDX_FLEET", columnList = "fleetId", unique = false)
        ,
        @Index(name = "IDX_USERSSS", columnList = "userId", unique = false)
        ,
        @Index(name = "IDX_TIME", columnList = "invoiceDate", unique = false)
        ,
        @Index(name = "IDX_SEQUENCE", columnList = "sequence", unique = false)
})
@JsonIgnoreProperties(ignoreUnknown = true)
public class Invoice implements Serializable {

    private static final long serialVersionUID = 1L;

    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(columnDefinition = "CHAR(36)")
    @Id
    private String id;

    @Column
    private long sequence;

...

Обновление:

  • возможно, есть обходной путь с findOne с сортировкой DESC для столбца последовательности?

    @ Query ("SELECT i.sequence" + "FROM Invoice as i" + "WHERE i.fleetId =: fleetId" + "ORDER BY i.sequence DESC") Long getMaxSequence (@Param ("fleetId") String fleetId);

Но мне нужно каким-то образом ОГРАНИЧИТЬ набор результатов до 1

Обновление 2:

исправил import org.springframework.data.jpa.repository.Query; все еще вошибка

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я нашел обходной путь:

создайте простой метод репозитория, возвращающий Page и принимающий Pageable:

Page<Invoice> findByFleetId(String fleetId, Pageable pageable);

Таким образом, мы можем имитировать ORDER BY sequence LIMIT 1 черезследующее:

long maxNewSeq = 0;
PageRequest pageRequest = new PageRequest(0, 1, Sort.Direction.DESC, "sequence");
Page<Invoice> pageableInvoices = invoiceRepository.findByFleetId(invoice.getFleetId(), pageRequest);
if(pageableInvoices.getTotalElements() > 0){
    maxNewSeq = pageableInvoices.getContent().get(0).getSequence();
}

invoice.setSequence(Math.max(0, maxNewSeq) + 1);

, кажется, работает как шарм.

0 голосов
/ 14 сентября 2018

Поскольку вы используете репозитории JPA, используйте:

org.springframework.data.jpa.repository.Query

аннотацию вместо

org.springframework.data.mongodb.repository.Query

Вы можете создать метод запроса без использования аннотации @Query, например:

Счет findFirstByFleetIdOrderBySequenceDesc (String fleetId);

, который возвращает необходимый счет.

...