用于搜索嵌套jsonb列对象的java规范谓词
我已经将jsonb对象存储在postgresql中
{"sample": {"lastName": "Sahani", "firstName": "Sanjay"}, "address": "Address2", "bedrooms": 2, "postcode": "40 BS", "propertyType": "Type 2"}
我的表名是估价报告\u json 而jsonb列名称是params 我可以使用规范获取地址,但无法获取样本的名字 我的规格是
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);
}
}
我的模特是 估价报告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
}
样本对象:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SampleObj implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String firstName;
private String lastName;
//getter setter
}
我不能使用连接谓词,因为我的对象没有映射或没有实体。 因为我见过同样的问题,但对象是实体:Specification/Predicate to Search Nested Objects
共 (0) 个答案