Предикат спецификации для поиска объектов вложенных столбцов jsonb - PullRequest
1 голос
/ 12 февраля 2020

Я сохранил объект jsonb в postgresql как

{"sample": {"lastName": "Sahani", "firstName": "Sanjay"}, "address": "Address2", "bedrooms": 2, "postcode": "40 BS", "propertyType": "Type 2"}

Моя таблица называется valuation_report_ json и столбец jsonb имя параметры Я могу получить адрес, используя Спецификацию, но не могу получить первое имя образца. Моя спецификация

public class ValuationReportJSONSpecification implements Specification<ValuationReportJSON>{

    private String locale;
    private String fieldToSearch;
    private String localeParameter;
public ValuationReportJSONSpecification(String locale, String fieldToSearch,String localeParameter) {
        this.locale = locale;
        this.fieldToSearch = fieldToSearch;
        this.localeParameter=localeParameter;
    }
@Override
    public Predicate toPredicate(Root<ValuationReportJSON> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        // TODO Auto-generated method stub
        System.err.println("INSIDE");
//      return cb.equal(cb.function("jsonb_extract_path_text", String.class, root.<String>get("params"), cb.literal(this.locale)), this.fieldToSearch);
        return cb.equal(cb.function("jsonb_extract_path_text", String.class,root.<String>get("params"), cb.literal(this.locale),cb.literal(this.localeParameter)),this.fieldToSearch);
    }
}

Мои модели ValuationReport JSON:

@Data
@NoArgsConstructor
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
@Table(name = "valuation_report_json")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class ValuationReportJSON implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Type(type = "jsonb")
    @Column(name = "parameters", nullable = false,columnDefinition = "jsonb")
    private Params params;

    @OneToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "property_id", nullable = true)
    private Property property;

    @Column(name = "entry_id", nullable = true)
    private Integer entryId;

    @Column(name = "report_data", nullable = true, columnDefinition = "text")
    private String reportData;

    @Column(name = "entry_date", nullable = true)
    @CreationTimestamp
    private Timestamp entryDate;

    @Column(name = "modified_date", nullable = true)
    @UpdateTimestamp
    private Timestamp modifiedDate;
//getter setter
}

Параметры

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Params implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public String address;

    private String postcode;

    private SampleObj sample;

    private int bedrooms;
//getter setter
}

SampleObj :

@Data
@NoArgsConstructor
@AllArgsConstructor
public class SampleObj implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String firstName;

    private String lastName;
//getter setter
}

Я не могу использовать объединение в предикате, поскольку у моих объектов нет сопоставления или нет юридическое лицо. потому что я видел тот же вопрос, но объекты были сущностью: Спецификация / Предикат для поиска вложенных объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...