【问题标题】:use Limit on HQL query对 HQL 查询使用限制
【发布时间】:2019-01-23 05:47:25
【问题描述】:

我在JpaRepository 中有一个HQL 查询

public interface LineRepository extends JpaRepository<LineEntity , Integer>{
    @Query(
            value = "SELECT l from LineEntity l" +
                    "WHERE l.lineCode = :lineCode "
    )
    List<LineEntity> findAllByLineCode(
            @Param("lineCode")int lineCode
    );

}

我想更改此方法以返回LineEntityLimit 仅适用于 nativeQuery,我想将其放入注释中

【问题讨论】:

  • 您需要将其实现为原生查询。您不能在 HQL 中使用 Limit,因为 Limit 取决于数据库供应商,因此 hibernate 不允许通过 hql 查询。

标签: postgresql hibernate spring-boot jpa hql


【解决方案1】:

在 hibernate 中的查询对象上有一个 setMaxResults(int maxResults) 方法。

我不使用如何将其放入注释中,而是使用它的经典方式如下:

Query q = session.createQuery("XXX").setMaxResults(1000);
q.list();

【讨论】:

  • 是的,这个解决方案是正确的,但希望将其用于注释
【解决方案2】:

如果你想在没有查询的情况下做到这一点,那么我们可以使用 Pageable 接口。 只需执行两个步骤。

1) 在控制器中

@RequestMapping("/getLineByLineCode/{code}")    
public @ResponseBody Page<LineEntity> getFirstUserByName(@PathVariable String code,Pageable pageable)
{
  // this pageable for single result.(first result will return)
    Page<LineCode> line = repository.findByCode(code,new PageRequest(0,1));
                                                        //(start index,upto index)
   return line;
} 

2) 在存储库中

public interface LineRepository extends JpaRepository<LineEntity , Integer>{
       Page<LineCode> findByCode(String code,Pageable pageable);
}

【讨论】:

    【解决方案3】:

    正如documentation 所述

    查询方法的结果可以通过使用first或top关键字来限制,可以互换使用。可以将可选数值附加到顶部或第一个以指定要返回的最大结果大小。如果省略数字,则假定结果大小为 1

    所以要限制为 10,您还可以使用:

    List<LineEntity> findTop10ByLineCode(int lineCode);
    

    【讨论】:

    • 我的问题出在 hql 查询上,我想在 @query 注释上使用,工作方式与 findFirst 相同,我的问题中的查询很简单
    【解决方案4】:

    如果有很多 LineEntity 具有相同的 LineCode 那么你需要一个额外的属性,该属性可以是 id,例如:

    public interface LineRepository extends JpaRepository<LineEntity , Integer>{
        @Query(
                value = "FROM LineEntity li WHERE li.id = " +
                        "(SELECT max(l.id) FROM LineEntity l " +
                        "WHERE l.lineCode = :lineCode)"
        )
        LineEntity findFirstByLineCode(
                @Param("lineCode") int lineCode
        );
    }
    

    【讨论】:

    • 子查询优化了吗?你在做什么 ?回答了我的问题还是创造了新的问题?
    • 昨天我遇到了同样的问题,就这样解决了。我只分享一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多