【问题标题】:Hibernate query method requires all columns being returned in query?Hibernate 查询方法需要在查询中返回所有列?
【发布时间】:2019-05-01 19:14:13
【问题描述】:

我已经为按特定列分组的存储库方法编写了本机查询。

我不能按id 分组,因为这会破坏分组。

      @Query(nativeQuery = true, value = "SELECT description, model_year, take_rate, number " +
          "FROM foo f " +
          "INNER JOIN bar b " +
          "ON b.cycle_plan_code = b.cycle_plan_code " +
          "WHERE b.programme = :programme " +
          "AND b.build_event = :buildEvent " +
          "AND f.vehicle_line = :vehicleLine " +
          "GROUP BY description, take_rate, model_year, number")
  List<FooEntity> findAllFooByBar(@Param("vehicleLine") String vehicleLine, @Param("programme") String programme,
                                          @Param("buildEvent") String buildEvent);

我的实体有一个 @Id 列和其他一些列

@Table(name = "foos")
public class FooEntity {

  @Id
  private Long id;

  @Column(name = "cycle_plan_code")
  private String cyclePlanCode;

  @Column(name = "model_year")
  private String year;

  @Column(name = "vehicle_line", nullable = true)
  private String vehicleLine;

  @Column(name = "number")
  private Integer number;

  @Column(name = "description")
  private String description;

  @Column(name = "take_rate")
  private double takeRate;

}

访问存储库方法时会引发休眠

o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'id' not found.

我试图通过将它添加到 select 子句来破解它

SELECT 0 as id

这会进行,但是它会抱怨查询不返回实体 vehicle_line 的其他列,model_year 我必须将它们全部添加到查询中才能使其工作。

我在注释中尝试了nullable = true 标志,但这不允许我从 select 子句中省略列。

如何返回仅返回一些我感兴趣的列的实体?

【问题讨论】:

    标签: java hibernate hibernate-native-query


    【解决方案1】:

    尝试使用投影: 用你想要的字段的 getter 声明一个接口:

    public interface SubFooEntity{
    String getDescription();
    String getModelYear();
    Double getTakeRate();
    Integers getNumber(); 
    }
    

    将存储库方法更改为以下:

     @Query("SELECT description, modelYear, takeRate, number " +
          "FROM foo f " +
          "INNER JOIN bar b " +
          "ON b.cyclePlanCode = b.cyclePlanCode " +
          "WHERE b.programme = :programme " +
          "AND b.build_event = :buildEvent " +
          "AND f.vehicle_line = :vehicleLine " +
          "GROUP BY description, takeRate, modelYear, number")
    
    
    List<SubFooEntity> findAllFooByBar(@Param("vehicleLine") String vehicleLine, @Param("programme") String programme,
                                              @Param("buildEvent") String buildEvent);
    

    更多信息在这里:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

    【讨论】:

    • 这很有效,谢谢。请注意,列别名在投影中很敏感。
    • @tomaytotomato 很高兴它做到了。请考虑接受答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2013-03-19
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多