jpql外键查询

ppcbkaq5  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(333)

有两张table个人和城市实体。数据库中的personentity通过外键fk\u cityid链接到cityentity。我需要用给定的cityid选择personentity表的所有记录(名称)。join在任何地方都可以使用,但在本例中,我不需要cityentity表中的数据,只需要personentity表的name字段。以下是类的描述:

@Entity
public class PersonEntity {
    private Long id;
    private String name;
    private CityEntity cityId;
}
@Entity
public class CityEntity {
    private Long id;
    private String name;
}

以下是hql查询:

@Repository
public interface PersonEntityRepository extends JpaRepository<PersonEntity, Long> {
  @Query("select p.name FROM PersonEntity p where (p.name = :name or :name is null) " +
        "and (p.cityId = :cityId or :cityId is null)")
    List<PersonEntity> findByNameAndCity (
        @Param("name") String name,
        @Param("cityId") CityEntity cityId);
}

试用者id:

@Query("select p.name FROM PersonEntity p where (p.name = :name or :name is null) " +
        "and (p.cityId.id = :cityId or :cityId is null)")
    List<PersonEntity> findByNameAndCity (
        @Param("name") String name,
        @Param("cityId") Long cityId);

在这两种情况下,错误都是:“无法确定数据类型”。
调用函数的选项:

servisPerson.findByNameAndCity (null, cityId);

servisPerson.findByNameAndCity (name, null);

事实上,有两个以上的参数。为了简化,我只展示了两个。

servisPerson.findByNameAndCity (name, age, ..., cityId);
6ovsh4lw

6ovsh4lw1#

个人实体应该是这样的

@Entity
public class PersonEntity {
     private Long id;
     private String name;

     @OneToOne
     @JoinColumn(name = "city_id")
     private CityEntity city;
}

你可以这样写你的查询

List<PersonEntity> findByNameAndCityOrNameIsNullOrCityIsNull(String name, CityEntity city);

springdatajpa非常聪明,可以在幕后为您生成查询。
顺便说一句,您试图编写jpql,而不是hql。
编辑(对有关长方法名的评论的React):
我建议避免创建jpql查询,因为它更容易出错。如果不喜欢冗长的方法名,可以将其 Package 为存储库中较短的默认方法:

@Repository
public interface PersonEntityRepository extends  JpaRepository<PersonEntity, Long> {
     List<PersonEntity> findByNameAndCityOrNameIsNullOrCityIsNull(String name, CityEntity city);

     default List<PersonEntity> shortName(String name, CityEntity city) {
         return findByNameAndCityOrNameIsNullOrCityIsNull(name, city);
     }
}

相关问题