如何在JPA条件查询中使用criteriaBuilder.construct构建嵌套对象
我想用person作为电话DTO对象查询电话列表,但在构造DTO对象时,它提供了一个错误如何在JPA条件查询中使用criteriaBuilder.construct构建嵌套对象,jpa,spring-data-jpa,criteria,criteria-api,jpa-criteria,Jpa,Spring Data Jpa,Criteria,Criteria Api,Jpa Criteria,我想用person作为电话DTO对象查询电话列表,但在构造DTO对象时,它提供了一个错误 Phone Entity: public class Phone { @Id @GeneratedValue private Long id; private String number; @Enumerated(EnumType.STRING) private PhoneType type; @ManyToOne @JoinColu
Phone Entity:
public class Phone {
@Id
@GeneratedValue
private Long id;
private String number;
@Enumerated(EnumType.STRING)
private PhoneType type;
@ManyToOne
@JoinColumn(name = "person_id")
private Person person;
}
Person Entity:
public class Person {
@Id
@GeneratedValue
private long id;
private String name;
private String nickName;
private String address;
private LocalDateTime createdAt;
@Version
private int version;
@OneToMany(mappedBy = "person" cascade = CascadeType.ALL)
private List<Phone> phones;
}
Phone DTO:
public class PhoneDTO {
private Long id;
private String number;
private PhoneType type;
private PersonDTO person;
}
Person DTO:
public class PersonDTO {
private long id;
private String name;
private String nickName;
private String address;
private LocalDateTime createdAt;
private int version;
}
电话实体:
公用电话{
@身份证
@生成值
私人长id;
私有字符串编号;
@枚举(EnumType.STRING)
私人电话类型;
@许多酮
@JoinColumn(name=“person\u id”)
私人;
}
个人和实体:
公共阶层人士{
@身份证
@生成值
私人长id;
私有字符串名称;
私有字符串昵称;
私有字符串地址;
私有LocalDateTime-createdAt;
@版本
私有int版本;
@OneToMany(mappedBy=“person”cascade=CascadeType.ALL)
私人名单电话;
}
电话号码:
公共课电话{
私人长id;
私有字符串编号;
私人电话类型;
私人对个人;
}
收件人:
公共类个人{
私人长id;
私有字符串名称;
私有字符串昵称;
私有字符串地址;
私有LocalDateTime-createdAt;
私有int版本;
}
条件查询:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<PhoneDTO> criteriaQuery = builder.createQuery(PhoneDTO.class);
Root<Phone> root = criteriaQuery.from(Phone.class);
Join<Phone, Person> person = root.join("person");
Path<Object> id = root.get("id");
Path<Object> number = root.get("number");
Path<Object> type = root.get("type");
Path<Object> personId = person.get("id");
Path<Object> name = person.get("name");
Path<Object> nickName = person.get("nickName");
Path<Object> address = person.get("address");
Path<Object> createdAt = person.get("createdAt");
Path<Object> version = person.get("version");
criteriaQuery.select(builder.construct(PhoneDTO.class, id, number, type, builder.construct(PersonDTO.class, personId, name, nickName, address, createdAt, version)));
TypedQuery<PhoneDTO> query = em.createQuery(criteriaQuery);
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(PhoneDTO.class);
Root=criteriaQuery.from(Phone.class);
Join person=root.Join(“人”);
路径id=root.get(“id”);
路径号=root.get(“编号”);
路径类型=root.get(“类型”);
Path personId=person.get(“id”);
路径名=person.get(“name”);
路径昵称=person.get(“昵称”);
路径地址=person.get(“地址”);
Path createdAt=person.get(“createdAt”);
路径版本=person.get(“版本”);
选择(builder.construct(PhoneDTO.class,id,number,type,builder.construct(PersonDTO.class,personId,name,昵称,地址,createdAt,版本));
TypedQuery=em.createQuery(criteriaQuery);
怎么做
选择(builder.construct(PhoneDTO.class,id,number,type,builder.construct(PersonMediumDTO.class,personId,name,昵称,address,createdAt,version))
如何构造嵌套对象???注意,由于JPA2.0不需要DTO对象,只需使用
实体
类即可。您只需返回Phone
和Person
类即可构建查询。对于JPA标准,您不需要使用CriteriaBuilder.construct,只需选择手机根目录,如任何Hello World JPA(或JPA Criteria API)教程第1页所示。如果我想从两个表中选择某个特定列并构造一个嵌套对象,那么代码将如何编写?在这种情况下,您的方法应该可以工作,你得到了哪一个错误,使用了你发布的两种选择方法中的哪一种?另一种方法是使用元组,避免在任何地方使用Object
。而是使用元模型API或指定正确的对象,如Path name=person。获取(“名称”)代码>我需要完全相同的,我有一个嵌套的DTO,我试图在另一个DTO中使用一个构造,但在antlr.noviablealException:意外标记:,