如何从 JPA 中的本机查询中提取别名
Posted
技术标签:
【中文标题】如何从 JPA 中的本机查询中提取别名【英文标题】:How to pull an alias from native query in JPA 【发布时间】:2018-05-10 09:31:02 【问题描述】:我正在尝试从 JPA 中的本机查询中提取别名,例如 (SUM,COUNT),如果我完美地提取了 SUM 或 COUNT,该方法可以返回一个整数(仅当我单独提取它时) 。 但我怎么能把它和其他物体一起拉呢?这是我正在尝试做的一个示例
@Entity
@Table("hotels")
public class Hotel
@Column(name="id")
@Id
private int hotelId;
@Column(name="hotel_name")
private String hotelName;
@OneToMany
private List<Availability>list;
private int avaialbeCount; //this one should be Aliased and need to be pulled by none column
存储库
public interface HotelRepository extends JpaRepository<Hotel,Integer>
@Query(value="select h.*,a.count(1) as avaialbeCount from hotels h INNER JOIN availability a on (a.hotel_id=h.hotel_id) group by a.date",nativeQuery=true)
public List<Hotel> getHotels();
在上面的存储库中。我试图通过酒店列获取 avaialbeCount 但我无法拉取它,但是我可以通过删除选择 h.* 来拉取它并仅保留选择 COUNT 并使该方法返回整数而不是酒店
【问题讨论】:
【参考方案1】:你可以使用 JPQL,像这样
@Query("SELECT new test.Hotel(h.hotelName, count(h)) FROM Hotel h GROUP BY h.hotelName")
要使用这个new test.Hotel(h.hotelName, count(h))
构造,你需要像
public Hotel(String hotelName, Long avaialbeCount)
this.hotelName = hotelName;
this.avaialbeCount = avaialbeCount;
示例:
存储库:
package test;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface HotelRepo extends JpaRepository<Hotel, Long>
@Query("SELECT new test.Hotel(h.hotelName, count(h)) FROM Hotel h GROUP BY h.hotelName")
List<Hotel> getHotelsGroupByName();
实体:
package test;
import javax.persistence.*;
@Entity
@Table(name = "hotels")
public class Hotel
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long hotelId;
@Column(name = "hotel_name")
private String hotelName;
@Transient
private Long avaialbeCount;
public Hotel()
public Hotel(String hotelName)
this.hotelName = hotelName;
public Hotel(String hotelName, Long avaialbeCount)
this.hotelName = hotelName;
this.avaialbeCount = avaialbeCount;
@Override
public String toString()
return "Hotel" +
"hotelId=" + hotelId +
", hotelName='" + hotelName + '\'' +
", avaialbeCount=" + avaialbeCount +
'';
@Transient
注解用于表示一个字段不会被持久化到数据库中。
【讨论】:
听起来合乎逻辑,但你为什么使用 Transient ? 我不能通过 nativw 查询来完成吗?我应该使用 JPQL 吗? Transient 用于未存储在数据库中的字段,我们可以计算这些字段,例如计数或平均值 JPQL 在这种情况下总是有效的,我从来没有尝试用原生查询来解决这个问题......以上是关于如何从 JPA 中的本机查询中提取别名的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Spring Boot JPA 执行具有 INTERVAL 子句的本机 SQL 查询?