通过外键进行 JPQL 查询
JPQL query by foreign key
有两个 tables PersonEntity 和 cityentity。数据库中的 PersonEntity 通过外部键 fk_cityid 链接到 cityentity。我需要 select 具有给定 CityId 的 PersonEntity table 的所有记录(名称)。 Join 无处不在,但在这种情况下,我不需要来自 cityentity table 的数据,只需要 PersonEntity table 的名称字段。这是 类:
的描述
@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);
个人实体应如下所示
@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);
Spring Data JPA 非常智能,可以在后台为您生成查询。
编辑(对长方法名称评论的反应):
我建议避免创建 JPQL 查询,因为这样更容易出错。如果你不喜欢冗长的方法名称,你可以将它包装成存储库中较短的默认方法:
@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);
}
}
有两个 tables PersonEntity 和 cityentity。数据库中的 PersonEntity 通过外部键 fk_cityid 链接到 cityentity。我需要 select 具有给定 CityId 的 PersonEntity table 的所有记录(名称)。 Join 无处不在,但在这种情况下,我不需要来自 cityentity table 的数据,只需要 PersonEntity table 的名称字段。这是 类:
的描述@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);
个人实体应如下所示
@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);
Spring Data JPA 非常智能,可以在后台为您生成查询。
编辑(对长方法名称评论的反应):
我建议避免创建 JPQL 查询,因为这样更容易出错。如果你不喜欢冗长的方法名称,你可以将它包装成存储库中较短的默认方法:
@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);
}
}