【发布时间】:2018-09-23 01:11:18
【问题描述】:
我正在尝试获取PlaceEntity。我之前存储了一堆GooglePlaceEntity 对象,其中
@Entity
@Table(name = "place")
@Inheritance(
strategy = InheritanceType.JOINED
)
public class PlaceEntity extends AbstractTimestampEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
和
@Entity
@Table(name = "google_place")
public class GooglePlaceEntity extends PlaceEntity {
// Additional fields ..
}
但是,我既不想发送存储在google_place 中的信息,也不想不必要地加载它。出于这个原因,我只是在获取
public interface PlaceRepository extends JpaRepository<PlaceEntity, Long> {
@Query(value = "" +
"SELECT * " +
"FROM place " +
"WHERE earth_distance( " +
" ll_to_earth(place.latitude, place.longitude), " +
" ll_to_earth(:latitude, :longitude) " +
") < :radius",
nativeQuery = true)
List<PlaceEntity> findNearby(@Param("latitude") Float latitude,
@Param("longitude") Float longitude,
@Param("radius") Integer radius);
}
我得到的是这样的:
org.postgresql.util.PSQLException: The column name clazz_ was not found in this ResultSet.
at org.postgresql.jdbc.PgResultSet.findColumn(PgResultSet.java:2588) ~[postgresql-9.4.1208-jdbc42-atlassian-hosted.jar:9.4.1208]
at org.postgresql.jdbc.PgResultSet.getInt(PgResultSet.java:2481) ~[postgresql-9.4.1208-jdbc42-atlassian-hosted.jar:9.4.1208]
at com.zaxxer.hikari.pool.HikariProxyResultSet.getInt(HikariProxyResultSet.java) ~[HikariCP-2.7.8.jar:na]
at org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$2.doExtract(IntegerTypeDescriptor.java:62) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
...
我可以在纯 PostgreSQL 中运行这条语句:
SELECT * FROM place WHERE
earth_distance(
ll_to_earth(place.latitude, place.longitude),
ll_to_earth(17.2592522, 25.0632745)
) < 1500;
但不使用JpaRepository。
顺便说一句,获取GooglePlaceEntity 是有效的:
@Query(value = "" +
"SELECT * " +
"FROM place JOIN google_place ON google_place.id = place.id " +
"WHERE earth_distance( " +
" ll_to_earth(place.latitude, place.longitude), " +
" ll_to_earth(:latitude, :longitude) " +
") < :radius",
nativeQuery = true)
List<GooglePlaceEntity> findNearby(@Param("latitude") Float latitude,
@Param("longitude") Float longitude,
@Param("radius") Integer radius);
【问题讨论】:
-
已删除答案,找到一个完全相同的答案stackoverflow.com/questions/2140992/…
-
@Zeromus 我很想听听这背后的技术故事。我调试了代码,它似乎在检测到一个类已经派生时分支,然后它尝试构建这样一个连接查询,至少在我看来,它不应该这样做。但是,编写本机查询并不是我使用 Hibernate 的原因。此时我将 is-a 转换为 has-a 关系。
标签: postgresql hibernate spring-data spring-data-jpa