OrderBy'yi Spring Data'da findAll ile kullanma


288

İlkbahar verilerini kullanıyorum ve DAO'm benziyor

public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllOrderByIdAsc();   // I want to use some thing like this
}

Yukarıdaki kodda, yorumlanan satır niyetimi gösterir. Spring Data, ASC / DESC ile bir sütuna göre tüm kayıt sırasını bulmak için böyle bir yöntemi kullanmak için dahili işlevsellik sağlayabilir mi?

Yanıtlar:


657
public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public List<StudentEntity> findAllByOrderByIdAsc();
}

Yukarıdaki kodun çalışması gerekir. Benzer bir şey kullanıyorum:

public List<Pilot> findTop10ByOrderByLevelDesc();

En yüksek seviyeye sahip 10 satır döndürür.

ÖNEMLİ: Bu cevabın kilit noktasını kaçırmanın kolay olduğu söylendiğinden, biraz açıklama:

findAllByOrderByIdAsc(); // don't miss "by"
       ^

4
Yöntem imzanızın Spring Data JPA ile amaçlandığı gibi çalışması için "all" anahtar sözcüğünü dahil etmelisiniz List<StudentEntity> findAllByOrderByIdAsc();. Bir dönüş türü eklemek ve gereksiz genel değiştiriciyi kaldırmak da iyi bir fikirdir;)
Håvard Geithus

1
Kamuoyunun gereksiz olduğunu kabul ediyorum, ancak başka birinin kodunuz üzerinde çalışması gerektiğinde işleri açık tutuyor. Kimin olacağını asla bilemezsiniz: PI yazarların kodundaki yöntem adından başka bir şey değiştirmedi çünkü sorunun nerede olduğu ve birisi orada ne olması gerektiğini bilmiyorsa, umarım yeni bir şey öğreneceklerdir. Ayrıca, aşağıdaki örneğimde tanrı nerede olduğunu bilmek zorunda kalmazlar, ama ısrar ederseniz, öyle olsun :) 'all' anahtar kelimesi eklendi. Teşekkürler.
Sikor

73
Biraz o Not Byönce OrderByanahtar kelimenin bütün fark.
Stefan Haberl

5
ByÖnüne fazladan bir şey eklemenin neden gerekli olduğunu hala anlamıyorum OrderBy. Dokümantasyon bu konuda fikir vermez .
Xtreme Biker

3
@XtremeBiker Sağladığınız dokümantasyon bağlantısından: "Ancak, ilk By, gerçek kriterlerin başlangıcını belirtmek için sınırlayıcı görevi görür." Ayrıca, "3.4.5. Sorgu sonuçlarını sınırlama" bölümüne ilerlerseniz, bunun gibi bir örnek vardır, ancak açıklanmamıştır.
Sikor

54

AFAIK, bunun doğrudan bir yöntem adlandırma sorgusu ile mümkün olduğunu düşünmüyorum. Ancak Sortsınıfı kullanarak yerleşik sıralama mekanizmasını kullanabilirsiniz . Depo, bir var findAll(Sort)sen bir örneğini geçebilir yöntemi Sortiçin. Örneğin:

import org.springframework.data.domain.Sort;

@Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(sortByIdAsc());
    }

    private Sort sortByIdAsc() {
        return new Sort(Sort.Direction.ASC, "id");
    }
} 

Belirtildiği gibi bu gerçekten findAllByOrderByIdAsc () kullanarak mümkündür altında Sikor cevabı gerçekten doğru cevap olmalı ... @Prashant
Samuel papaz evi

Depolarınızı daha az dağınık tutmak istiyorsanız, hizmet katmanındaki sıralamayı yapmanın alternatif yolu. Yine de sonuç boyutunu unutmayın!
dkanejs

2
Yöntem findAll()türü CrudRepository<>(Sıralama) bağımsız değişkenler için geçerli değildir
Thiago Pereira

5
@ThiagoPereira JpaRepository<>yukarıdaki örneği kullanmak istiyorsanız genişletmeniz gerekir .
Waleed Abdalmajeed

15

Lütfen şuna bir göz atın: Bahar Verileri JPA - Referans Belgeleri, bölüm 5.3'e . Sorgulama Yöntemleri , özellikle bölüm 5.3.2. Sorgu Oluşturma , " Tablo 3. Yöntem adları içinde desteklenen anahtar kelimeler " (2019-05-03 tarihinden itibaren bağlantılar).

Sanırım tam olarak neye ihtiyacınız olduğunu ve belirttiğiniz gibi aynı sorgu çalışması gerekir ...


1
Bağlantınız çalışmıyor -> Bu bağlantıya işaret etmek istediğinizi varsayıyorum: docs.spring.io/spring-data/jpa/docs/current/reference/html/…
Jørgen Skår Fischer


3

Evet, Spring Data'da sorgu yöntemini kullanarak sıralayabilirsiniz.

Örn: id alanının değerini kullanarak artan düzen veya azalan düzen.

Kod:

  public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllByOrderByIdAsc();   
}

alternatif çözüm:

    @Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(orderByIdAsc());
    }
private Sort orderByIdAsc() {
    return new Sort(Sort.Direction.ASC, "id")
                .and(new Sort(Sort.Direction.ASC, "name"));
}
}

Bahar Verileri Sıralama: Sıralama


3

Bu örnekte, OrderBy türlerinizi kişiselleştirmek için size tam bir örnek göstermeye çalışıyorum

 import java.util.List;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.*;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.data.domain.Sort;
 /**
 * Spring Data  repository for the User entity.
 */
 @SuppressWarnings("unused")
 @Repository
 public interface UserRepository extends JpaRepository<User, Long> {
 List <User> findAllWithCustomOrderBy(Sort sort);
 }

Bu örneği kullanırsınız: Sort örneğini dinamik olarak bir nesne oluşturmak için bir yöntem:

import org.springframework.data.domain.Sort;
public class SampleOrderBySpring{
 Sort dynamicOrderBySort = createSort();
     public static void main( String[] args )
     {
       System.out.println("default sort \"firstName\",\"name\",\"age\",\"size\" ");
       Sort defaultSort = createStaticSort();
       System.out.println(userRepository.findAllWithCustomOrderBy(defaultSort ));


       String[] orderBySortedArray = {"name", "firstName"};
       System.out.println("default sort ,\"name\",\"firstName\" ");
       Sort dynamicSort = createDynamicSort(orderBySortedArray );
       System.out.println(userRepository.findAllWithCustomOrderBy(dynamicSort ));
      }
      public Sort createDynamicSort(String[] arrayOrdre) {
        return  Sort.by(arrayOrdre);
        }

   public Sort createStaticSort() {
        String[] arrayOrdre  ={"firstName","name","age","size");
        return  Sort.by(arrayOrdre);
        }
}

0

Yukarıdaki tüm cevapları birleştirerek BaseEntity ile yeniden kullanılabilir kod yazabilirsiniz:

@Data
@NoArgsConstructor
@MappedSuperclass
public abstract class BaseEntity {

  @Transient
  public static final Sort SORT_BY_CREATED_AT_DESC = 
                        Sort.by(Sort.Direction.DESC, "createdAt");

  @Id
  private Long id;
  private LocalDateTime createdAt;
  private LocalDateTime updatedAt;

  @PrePersist
  void prePersist() {
    this.createdAt = LocalDateTime.now();
  }

  @PreUpdate
  void preUpdate() {
    this.updatedAt = LocalDateTime.now();
  }
}

DAO nesnesi aşırı yükle findAll yöntemi - temel olarak, yine de kullanır findAll()

public interface StudentDAO extends CrudRepository<StudentEntity, Long> {

  Iterable<StudentEntity> findAll(Sort sort);

}

StudentEntityBaseEntityyinelenebilir alanlar içeren genişletir (belki de kimliğe göre sıralamak istersiniz)

@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
class StudentEntity extends BaseEntity {

  String firstName;
  String surname;

}

Son olarak, hizmet ve kullanımı SORT_BY_CREATED_AT_DESCmuhtemelen sadece StudentService.

@Service
class StudentService {

  @Autowired
  StudentDAO studentDao;

  Iterable<StudentEntity> findStudents() {
    return this.studentDao.findAll(SORT_BY_CREATED_AT_DESC);
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.