将sql查询数据Map回存储库中的java对象

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

我开始使用hibernate进行查询,我注意到如果我想使用存储库执行查询,我必须使用存储库中的实体来Map返回数据库的值。
我是否可以在任何存储库中运行查询并返回数据并Map到具有相同名称的java类中。
喜欢

@Query(value = "SELECT location_id, (3959 * acos (cos(radians(:lat)) * cos(radians(l.latitude)) * cos(radians(l.longitude) - radians(:lon))  + sin(radians(:lat)) * sin(radians(l.latitude)))) AS distance FROM location l having distance < :mile order by distance limit 0, :limitNum", nativeQuery = true)
List<LocationDistance> searchLocationByRadius(@Param("lat") double lat, @Param("lon") double lon, @Param("mile") double distance, @Param("limitNum") int limit);

因此,查询返回的location\u id和distance字段将自动Map到locationdistance对象。

ax6ht2ek

ax6ht2ek1#

您有两种选择:
切换到jpql查询并在查询中使用构造函数,如:

@Query(value = "SELECT new example.LocationDistance(location_id, distance_calculation) " +
               "FROM location ...")
List<LocationDistance> searchLocationByRadius(@Param("lat") double lat, @Param("lon") double lon, @Param("mile") double distance, @Param("limitNum") int limit);

在这种方法中,不能直接使用cos/sin/radians函数,因为jpql不支持它们。相反,您需要使用jpql function 给他们打电话,比如:

function('cos', tab.column)

或者,如果使用hibernate,可以用hibernate方言注册函数。
切换到 @SqlResultSetMapping 以及 @NamedNativeQuery 首先,您需要添加 @SqlResultSetMapping 以及 @NamedNativeQuery 实体类的注解。

@SqlResultSetMapping(
           name="myMapping",
           classes={
              @ConstructorResult(
                   targetClass=LocationDistance.class,
                     columns={
                        @ColumnResult(name="location_id"),
                        @ColumnResult(name="distance")
                        }
              )
           }
)
@NamedNativeQuery(name="Location.searchLocationByRadius", 
        resultSetMapping="myMapping", 
        query="...")
@Entity
public class Location {
  ...
}

其次,您需要向spring存储库接口添加一个方法,该方法的名称与 @NamedNativeQuery .

@Repository
public interface LocationRepository extends JpaRepository<Location, Long> {
    List<LocationDistance> searchLocationByRadius(...);
}

相关问题