我已更改了诊所示例,并为宠物添加了实体投影。
entity projection --class ~.domain.PetInfo --entity ~.domain.Pet --fields id,name,type,birthDay,owner --entityFormatExpression "#{name} (#{type})"
repository jpa --entity ~.domain.Pet --interface ~.repository.PetRepository --defaultReturnType ~.domain.PetInfo
我删除了所有寻找宠物的人。查找程序必须更改使用PetInfo作为返回类型 - 所以我删除它们以仅测试实体投影。
在我添加实体投影之前,列表会显示带有和没有设置所有者的表Pets中的所有条目。
当我在列表中添加实体投影时,只显示拥有者不为空的项目。
我使用mysql db并更改设置:
// Create the Spring Boot application
project setup --topLevelPackage org.springframework.roo.clinic --projectName clinic_new --java 8
// Setup the data access layer
// jpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
jpa setup --provider HIBERNATE --database MYSQL --databaseName clinic --userName root --password
// --force funktioniert nicht also erst löschen un dann neu hinzufügen
property remove --key spring.datasource.url
property add --key spring.datasource.url --value jdbc:mysql://localhost:3307/clinic --force
property add --key spring.jpa.properties.hibernate.hbm2ddl.auto --value update
property add --key spring.jpa.properties.hibernate.dialect --value org.hibernate.dialect.MySQL5Dialect
property add --key spring.jpa.hibernate.naming.physical-strategy --value org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
property remove --key spring.messages.encoding
property add --key spring.messages.encoding --value UTF-8
property add --key spring.jpa.hibernate.show-sql --value true
答案 0 :(得分:1)
Spring Roo在PetRepositoryImpl_Roo_Jpa_Repository_Impl.aj
文件中生成以下代码:
JPQLQuery<Pet> query = from(pet);
[...]
return loadPage(query, pageable, Projections.constructor(PetInfo.class, pet.id, pet.name, pet.type, pet.owner ));
默认情况下,loadPage
函数会生成一个包含所有者表的INNER JOIN
,因此只显示与Owner
有关系的pet元素。
为防止这种情况发生,您应该引入findAll
方法并定义leftJoin
语句。
JPQLQuery<Pet> query = from(pet).leftJoin(pet.owner);
有了这个,你应该能够获得所有与关系无关的宠物。
希望它有所帮助,