Hibernate 用集合字符串构造Dto投影
我使用SpringBoot2JPA和hibernate 我试着用我的一个实体做一个dto投影Hibernate 用集合字符串构造Dto投影,hibernate,jpa,spring-data-jpa,Hibernate,Jpa,Spring Data Jpa,我使用SpringBoot2JPA和hibernate 我试着用我的一个实体做一个dto投影 @Entity public class Factories extends BaseEntity { @Id @SequenceGenerator(name = "factories_id_seq", sequenceName = "factories_id_seq", allocationSize = 1) @GeneratedValue(strategy = Genera
@Entity
public class Factories extends BaseEntity {
@Id
@SequenceGenerator(name = "factories_id_seq", sequenceName = "factories_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "factories_id_seq")
private Integer id;
private String name;
private String address;
@OneToOne
private Cities cities;
@ManyToMany
private Set<GranulateProducts> granulateProducts = new HashSet<>();
@JsonIgnore
@OneToMany(mappedBy = "factory", cascade = CascadeType.ALL, orphanRemoval = true)
private final List<Machines> machines = new ArrayList<>();
@ElementCollection
private Collection<String> emails = new ArrayList<String>();
private boolean generatedEmail;
private boolean generation;
private String phone;
private String fax;
private String director;
...
}
@实体
公共类工厂扩展BaseEntity{
@身份证
@SequenceGenerator(name=“factories\u id\u seq”,sequenceName=“factories\u id\u seq”,allocationSize=1)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“Factorys\u id\u seq”)
私有整数id;
私有字符串名称;
私有字符串地址;
@奥内托内
私人城市;
@许多
private Set granulateProducts=new HashSet();
@杰索尼奥雷
@OneToMany(mappedBy=“factory”,cascade=CascadeType.ALL,orphan=true)
私有最终列表机器=新的ArrayList();
@元素集合
私人收集电子邮件=新建ArrayList();
私人布尔生成邮件;
私有布尔生成;
私人电话;
私人字符串传真;
私有字符串控制器;
...
}
我的dto
public class FactoriesEditDto {
private Integer id;
private String name;
private String address;
private Integer citiesId;
private String citiesName;
private List<Integer> machinesId = new ArrayList<>();
private List<String> emails = new ArrayList<>();
private boolean generatedEmail;
private boolean generation;
private String phone;
private String fax;
private String director;
public FactoriesEditDto(Integer id, String name, String address, Cities cities, List<Machines> machines, Collection<String> emails, boolean generatedEmail, boolean generation, String phone, String fax, String director) {
this.id = id;
this.name = name;
this.address = address;
if (cities != null) {
this.citiesId = cities.getId();
this.citiesName = cities.getName();
}
machines.stream().forEach(machine -> machinesId.add(machine.getId()));
this.emails = (List<String>) emails;
this.generatedEmail = generatedEmail;
this.generation = generation;
this.phone = phone;
this.fax = fax;
this.director = director;
}
...
}
public interface FactoriesRepository extends JpaRepository<Factories, Integer> {
public FactoriesEditDto findDtoedById(Integer id);
公共类factoriesdetto{
私有整数id;
私有字符串名称;
私有字符串地址;
私有整数citiesId;
私有字符串citiesName;
private List machinesId=new ArrayList();
私有列表电子邮件=新建ArrayList();
私人布尔生成邮件;
私有布尔生成;
私人电话;
私人字符串传真;
私有字符串控制器;
public FactoriesEditTo(整数id、字符串名称、字符串地址、城市、列表机、收集电子邮件、布尔生成邮件、布尔生成、字符串电话、字符串传真、字符串控制器){
this.id=id;
this.name=名称;
this.address=地址;
如果(城市!=null){
this.citiesId=cities.getId();
this.citiesName=cities.getName();
}
machines.stream().forEach(machine->machinesId.add(machine.getId());
this.emails=(列表)电子邮件;
this.generatedEmail=generatedEmail;
这个世代=世代;
this.phone=电话;
this.fax=传真;
this.director=director;
}
...
}
公共接口factoresepository扩展了JpaRepository{
public factoriesdetto findDtoedById(整数id);
}
当我运行并尝试进行转换时,我得到
org.hibernate.hql.internal.ast.QuerySyntaxException:无法找到
类[com.lcm.dto.factoriesdito]上的适当构造函数。
预期参数为:int、java.lang.String、java.lang.String、,
com.lcm.model.Cities、com.lcm.model.Machines、java.lang.String、,
布尔值,布尔值,java.lang.String,java.lang.String,
java.lang.String[
选择new com.lcm.dto.factoriesdetto(generatedAlias0.id,
generatedAlias0.name,generatedAlias0.address,
城市、机器、电子邮件、,
generatedAlias0.generatedEmail,generatedAlias0.generation,
generatedAlias0.电话,generatedAlias0.传真,
从com.lcm.model.Factories生成的ADIAS0.director)作为
generatedAlias0左连接generatedAlias0.machines作为机器
left join GenerateDias0.email作为电子邮件,其中
generatedAlias0.id=:param0
]
看起来,电子邮件就像一个字符串,而不是字符串的集合…正如JPA规范告诉您的,您不能选择多值字段。一个集合可以吗?所以我们需要忘记dto投影。。。对所有人来说。。。