是否可以覆盖Spring的JpaSpecification“findAll”方法来向我的实体添加额外的字段?

ego6inou  于 2023-03-11  发布在  Spring
关注(0)|答案(2)|浏览(126)

我正在使用Java 11和Sping Boot 2.5。我有一个带有@Transient字段的JPA实体

@Entity
public class MyEntity {
    ...
    private String name;
    ...
    @Transient
    private String group;
}

和JPA存储库

public interface MyEntityRepository
    extends JpaRepository<MyEntity, Long>, JpaSpecificationExecutor<MyEntity> {
    ...
    ...
}

MyEntity和Gruop之间的关系是my_entity表有一个group_id列,它链接到group表的主键(名为“id”)。有没有一种方法可以覆盖“findAll”以检索MyEntity的所有列和附加的“group”String字段?我不希望使用@OneToMany注解将整个Group对象链接到MyEntity类。

vawmfj5a

vawmfj5a1#

晚安朋友,
我认为,由于JPA不使用@OneToMany,因此无法了解表之间的关系,您必须手动执行此操作,findAll()方法的示例;

@Repository
public interface MyEntityRepository
extends JpaRepository<MyEntity, Long>, JpaSpecificationExecutor<MyEntity> {
     ...
     ...
}

@Service
public class MyEntityService {

@Autowired
private MyEntityRepository myEntityRepository;

@Autowired
private MyGroupRepository myGroupRepository;

public List<MyEntity> findAll() {

    List<MyEntity> listMyEntity = myEntityRepository.findAll();
       
    for (MyEntity my = listMyEntity) {
         Group group = myEntityRepository.findById(my.getId());
         my.setGroup(group);
    }       

    return listMyEntity;
}
whlutmcx

whlutmcx2#

您可以编写一个带有自定义查询的函数来联接这两个表:
沿着于(还没试过)

public interface MyEntityRepository extends JpaRepository<MyEntity, Long>, JpaSpecificationExecutor<MyEntity> {
@Query("select e.name, p.group_name from MyEntity e JOIN Group p on e.group_id = p.id")
List<Object[]> findEntities();

}

但是它不会返回MyEntity类型,您必须将结果Map到其他类型。
但是,您不应该使用@Transient组,而应该将其作为group_id列。
另请参阅此blog

相关问题