Untitled

 avatar
unknown
plain_text
2 months ago
2.7 kB
4
Indexable
// Entity sınıfı (örnek)
@Entity
@Table(name = "your_table")
public class YourEntity {
    @Id
    private Long id;
    private String deviceId;
    private String appName;
    private boolean deleted;
    private boolean disabled;
    
    // Getter ve Setter metodları
}

// Service veya Repository sınıfı içinde
@Repository
public class YourRepository {
    @PersistenceContext
    private EntityManager entityManager;
    
    @Transactional
    public void updateDuplicateRecords() {
        // 1. Önce çoklayan kayıtları bulalım
        String findDuplicatesQuery = """
            WITH DuplicateRecords AS (
                SELECT 
                    id,
                    ROW_NUMBER() OVER (
                        PARTITION BY app_name, device_id
                        ORDER BY id DESC
                    ) as row_num
                FROM your_table
                WHERE deleted = false AND disabled = false
            )
            SELECT id FROM DuplicateRecords WHERE row_num > 1
            """;
            
        // Çoklayan ID'leri alalım
        List<Long> duplicateIds = entityManager.createNativeQuery(findDuplicatesQuery)
            .getResultList();
            
        // 2. Eğer çoklayan kayıt varsa bunları güncelleyelim
        if (!duplicateIds.isEmpty()) {
            String updateQuery = """
                UPDATE YourEntity e 
                SET e.deleted = true 
                WHERE e.id IN :ids
                """;
                
            entityManager.createQuery(updateQuery)
                .setParameter("ids", duplicateIds)
                .executeUpdate();
                
            // Entity Manager'ı temizleyelim
            entityManager.flush();
            entityManager.clear();
        }
    }
    
    // Opsiyonel: Test için çoklayan kayıtları görüntüleme metodu
    public List<YourEntity> findDuplicates() {
        String query = """
            SELECT e FROM YourEntity e
            WHERE e.id IN (
                WITH DuplicateRecords AS (
                    SELECT 
                        id,
                        ROW_NUMBER() OVER (
                            PARTITION BY app_name, device_id
                            ORDER BY id DESC
                        ) as row_num
                    FROM your_table
                    WHERE deleted = false AND disabled = false
                )
                SELECT id FROM DuplicateRecords WHERE row_num > 1
            )
            """;
            
        return entityManager.createQuery(query, YourEntity.class)
            .getResultList();
    }
}
Editor is loading...
Leave a Comment