Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JPA条件查询中使用criteriaBuilder.construct构建嵌套对象_Jpa_Spring Data Jpa_Criteria_Criteria Api_Jpa Criteria - Fatal编程技术网

如何在JPA条件查询中使用criteriaBuilder.construct构建嵌套对象

如何在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

我想用person作为电话DTO对象查询电话列表,但在构造DTO对象时,它提供了一个错误

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:意外标记:,