Пользовательский запрос с нумерацией страниц, не работающий в репозитории Spring boot JPA

#mysql #sql #spring #spring-boot #spring-data-jpa

#mysql #sql #spring #spring-boot #spring-data-jpa

Вопрос:

У меня есть требование получать все записи на основе определенных условий при использовании нумерации страниц в Spring JPA.

Я попробовал два подхода:

1.

 @Query(value = "SELECT * FROM channel c, channel_plans cp, channel_pricing cpr where c.id=cp.channel_id AND cp.id=cpr.plans_id AND CURRENT_TIMESTAMP between cpr.validity_start and cpr.validity_end and cpr.is_active=1",nativeQuery = true)
Page<channel> findAll(Pageable pageable);
  
 @Query(value = "SELECT * FROM channel c, channel_plans cp, channel_pricing cpr where c.id=cp.channel_id AND cp.id=cpr.plans_id AND CURRENT_TIMESTAMP between cpr.validity_start and cpr.validity_end and cpr.is_active=1",
    countQuery = "SELECT count(*) FROM channel c, channel_plans cp, channel_pricing cpr where c.id=cp.channel_id AND cp.id=cpr.plans_id AND CURRENT_TIMESTAMP between cpr.validity_start and cpr.validity_end and cpr.is_active=1",nativeQuery = true)
Page<channel> findAll(Pageable pageable);   
  

Сущности:

 @Entity
public class ChannelPricing {
    @Id
    private int id; 
    
    @Column(name="validity_start") 
    private String validityStart; 

    @Column(name="validity_end")
    private String validityEnd; 

    @Column(name="is_active") 
    private int isActive;

    // other entity fields, getters, setters, equals, toString etc...
}
@Entity
    public class Channel {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        
        @OneToMany(cascade = CascadeType.ALL)
        @JoinColumn(name = "channel_id",referencedColumnName = "id")
        private List<ChannelPlans> plans;
        
        // other entity fields, getters, setters, equals, toString etc...
        }
@Entity
    public class ChannelPlans {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonIgnore
    private int id;
    
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name="plans_id",referencedColumnName ="id")
    private List<ChannelPricing> priceInfo;
    // other entity fields, getters, setters, equals, toString etc...
    }
  

Я хочу получить все записи, которые активны ( is_active=1 ). Но в обоих подходах я получаю активные и неактивные записи.

Кажется, этот запрос не выполняется, Не могли бы вы, пожалуйста, помочь мне понять, пропустил ли я что-нибудь?

Комментарии:

1. Вы должны предоставить дополнительную информацию. Можете ли вы добавить channel объект в вопрос? Какой результат вы получили? Какого результата вы ожидаете?

2. я хочу получить все записи, которые активны (is_active = 1). Но я получаю записи с активными и неактив

3. можете ли вы предоставить channel класс сущности?

4. Я думаю, что вам нужна channel_pricing для проверки {private int id; private double rate; private int views; private int cpt; private int tvr; private int cpp; отказ от ответственности за частную строку; private int spots; @Column(name=»spot_rate») private double spotRate; @Column(name=»spot_length») private int spotLength ; @Column(name=»validity_start») private String validityStart; @Column(name=»validity_start») private String validityStart; @Column(name= «validity_end») закрытая строка validityEnd; @Column(name=»rate_card») private int RateCard; @Column(name=»is_active») private int активен;}

5. Чтобы помочь решить проблему, мы должны понять вашу структуру данных. Пожалуйста, предоставьте всем связанным объектам необходимые поля

Ответ №1:

Если какой-либо из Channel имеет хотя бы одну активную цену, ваш запрос возвращает ее в результате. Channel Экземпляр будет содержать все, ChannelPlans содержащие все ChannelPricing (активные и неактивные). Вы не можете получить часть ChannelPricing списка внутри другого объекта. Разрешено сохранять список с отложенной загрузкой или извлекать полный список.

Для активации ChannelPricing должен возвращаться только запрос Page<ChannelPricing>

Сущности:

 @Entity
public class Channel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
        
    @OneToMany(mappedBy = "channel", cascade = CascadeType.ALL)
    private List<ChannelPlans> plans;
        
    // other entity fields, getters, setters, equals, toString etc...
}

@Entity
public class ChannelPlans {    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonIgnore
    private int id;

    @ManyToOne
    @JoinColumn(name = "channel_id")
    Channel channel;
    
    @OneToMany(mappedBy = "channelPlans", cascade = CascadeType.ALL)
    private List<ChannelPricing> priceInfo;
    // other entity fields, getters, setters, equals, toString etc...
}

@Entity
public class ChannelPricing {
    @Id
    private int id; 

    @ManyToOne
    @JoinColumn(name = "plans_id")
    ChannelPlans channelPlans;
    
    @Column(name="validity_start") 
    private LocalDateTime validityStart; 

    @Column(name="validity_end")
    private LocalDateTime validityEnd; 

    @Column(name="is_active") 
    private int isActive;

    // other entity fields, getters, setters, equals, toString etc...
}
  

Репозиторий:

 public interface ChannelPricingRepository extends JpaReposirory<ChannelPricing, Integer> {
    @Query("from ChannelPricing p where p.isActive=1 and p.validityStart<=now() and p.validityEnd>=now()")
    Page<ChannelPricing> getActivePrices(Pageable pageable);
}