【发布时间】:2018-04-10 18:15:59
【问题描述】:
我正在尝试使用 JPA 查询和投影仅检索特定部分的数据。这是查询:
@Repository
public interface CompanyRepository extends CrudRepository<Company, Integer> {
@Query("select co.companyID as companyid, co.companyName as companyname, co.companyAbbr as companyabbr, co.flags as flags from Company co order by companyName asc")
List<CompanyWithFlags> getAllCompaniesWithFlags();
}
这是投影:
public interface CompanyWithFlags {
Integer getCompanyid();
String getCompanyname();
String getCompanyabbr();
List<CompanyFlag> getFlags();
}
这是公司实体:
@Entity
@Table(name="companies.companies")
public class Company implements Serializable {
private static final long serialVersionUID = 1L;
private int companyID;
private String companyName;
private String companyAbbr;
...
private List<CompanyFlag> flags = new ArrayList<>();
public Company() {}
@Id
@Column(name="pk_companyid")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonView(View.AllCompaniesView.class)
public int getCompanyID() {
return companyID;
}
public void setCompanyID(int companyID) {
this.companyID = companyID;
}
@Column(name="companyname", columnDefinition="VARCHAR(72)")
@JsonView(View.AllCompaniesView.class)
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
@Column(name="companyabbr", columnDefinition="VARCHAR(8)")
@JsonView(View.AllCompaniesView.class)
public String getCompanyAbbr() {
return companyAbbr;
}
public void setCompanyAbbr(String companyAbbr) {
this.companyAbbr = companyAbbr;
}
...
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="companies.co_flags",
joinColumns = @JoinColumn(name="fk_companyid", referencedColumnName="pk_companyid"),
inverseJoinColumns = @JoinColumn(name="fk_flagid", referencedColumnName="pk_flagid"))
@JsonView(View.AllCompaniesView.class)
public List<CompanyFlag> getFlags() {
return flags;
}
public void setFlags(List<CompanyFlag> flags) {
this.flags = flags;
}
}
如果我将CompanyFlag 排除在查询和投影之外,一切正常。如果我不编写查询,而是使用:
List<CompanyWithFlags> findAllByOrderByCompanyNameAsc();
然后我根据需要获取数据,但还会生成很长的其他(不必要的)查询列表。
事实上,hibernate (5.2.14) 会生成这个查询:
select
company0_.pk_companyid as col_0_0_,
company0_.companyname as col_1_0_,
company0_.companyabbr as col_2_0_,
. as col_3_0_,
companyfla2_.pk_flagid as pk_flagi1_9_,
companyfla2_.fk_categoryid as fk_categ3_9_,
companyfla2_.flagname as flagname2_9_
from companies.companies company0_
inner join companies.co_flags flags1_ on company0_.pk_companyid=flags1_.fk_companyid
inner join companies.config_flags companyfla2_ on flags1_.fk_flagid=companyfla2_.pk_flagid
order by companyName asc
很明显,问题出在. as col_3_0_,但我不知道为什么会生成它或如何摆脱它。谁能解释为什么hibernate要添加它以及我可以在存储库中做些什么来以有效的方式获得所需的数据?谢谢!
【问题讨论】:
标签: mysql hibernate spring-data-jpa