如何从 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 查询?

JPA将列表传递给命名本机查询中的IN子句

JPA 中的传递列表命名本机查询

如何使用 jpa 执行本机 memsql 查询 [重复]

“where”条件在 JPA 中的联接查询中无法正常工作(本机查询)

如何使用本机查询在 JPA 中执行嵌套联接