小编mac*_*ias的帖子

使用Spring Data JpaRepository按计数排序

我正在使用Spring Data JpaRepository,我发现它非常易于使用.我实际上需要所有这些功能 - 分页,排序,过滤.不幸的是,有一件令人讨厌的事情似乎迫使我回归使用普通的JPA.

我需要按相关集合的大小排序.比如我有:

@Entity
public class A{
    @Id
    private long id;
    @OneToMany
    private List<B> bes;
//boilerplate
}
Run Code Online (Sandbox Code Playgroud)

我不得不排序 bes.size()

有没有办法以某种方式定制订单仍然利用分页,过滤和其他Spring Data的强大功能?

java jpa spring-data

11
推荐指数
2
解决办法
8816
查看次数

在Spring数据JpaRepository方法问题中的Pageable和@Param

我有一个以下的存储库:

public interface MilestoneRepository extends JpaRepository<Milestone,Date> {
    @Query("select m from Milestone m where m.date <= :date order by m.date desc")
    Page<Milestone> findLeftClosest(@Param("date") Date date, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

像上面定义的工作正常,但如果我切换参数顺序:

public interface MilestoneRepository extends JpaRepository<Milestone,Date> {
    @Query("select m from Milestone m where m.date <= :date order by m.date desc")
    Page<Milestone> findLeftClosest(Pageable pageable, @Param("date") Date date);
}
Run Code Online (Sandbox Code Playgroud)

我在上下文初始化时遇到以下异常(发布最有趣的底层原因):

Caused by: java.lang.IllegalArgumentException: Either use @Param on all parameters except Pageable and Sort typed once, or none at all!
    at org.springframework.util.Assert.isTrue(Assert.java:65)
    at org.springframework.data.repository.query.Parameters.assertEitherAllParamAnnotatedOrNone(Parameters.java:265)
    at org.springframework.data.repository.query.Parameters.<init>(Parameters.java:85) …
Run Code Online (Sandbox Code Playgroud)

java jpa spring-data spring-data-jpa

7
推荐指数
1
解决办法
5587
查看次数

前提条件库为notNull检查抛出IllegalArgumentException

您是否知道Apache Commons ValidateGuava Preconditions的一些不错的替代方案,当检查对象是否为null(Spring Assert除外)时会抛出IllegalArgumentException而不是NullPointerException ?


我知道Javadocs说:

应用程序应抛出此类的实例[NullPointerException]以指示null对象的其他非法使用.

不过,我只是不喜欢它.对我来说,NPE总是意味着我只是忘了在某个地方获得null引用.我的眼睛是如此受过训练,我可以发现它以每秒几页的速度浏览日志,如果我这样做,那么我的头脑中始终会启用bug警报.因此,如果将它抛到我期望IllegalArgumentException的位置,那将是非常令人困惑的.

说我有一个豆子:

public class Person {
  private String name;
  private String phone;
  //....
}
Run Code Online (Sandbox Code Playgroud)

和服务方法:

public void call(Person person) {
  //assert person.getPhone() != null
  //....
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,一个人没有电话可能没问题(我的奶奶不拥有任何电话).但是如果你想打电话给这样的人,对我而言,它会调用带有IllegalArgument调用方法.查看层次结构 - NullPointerException甚至不是IllegalArgumentException的子类.它基本上告诉你 - 再次尝试在null引用上调用getter.

此外,已经有讨论,我完全支持这个很好的答案.所以我的问题只是 - 我是否需要像这样做丑陋的事情:

Validate.isTrue(person.getPhone() != null, "Can't call a person that hasn't got a phone");
Run Code Online (Sandbox Code Playgroud)

有我的方式,或者是否有一个库只会抛出IllegalArgumentException进行notNull检查?

java nullpointerexception apache-commons preconditions guava

7
推荐指数
2
解决办法
4752
查看次数

使用Jest使用自定义分析器创建索引的麻烦

Jestelasticsearch提供了一个出色的异步API,我们发现它非常有用.但是,有时事实证明,产生的请求与我们预期的略有不同.

通常我们不关心,因为一切都很好,但在这种情况下它不是.

我想用自定义ngram分析器创建索引.当我按照elasticsearch rest API文档执行此操作时,我在下面调用:

curl -XPUT 'localhost:9200/test' --data '
{
  "settings": {
    "number_of_shards": 3,
    "analysis": {
      "filter": {
        "keyword_search": {
          "type":     "edge_ngram",
          "min_gram": 3,
          "max_gram": 15
        }
      },
      "analyzer": {
        "keyword": {
          "type":      "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "keyword_search"
          ]
        }
      }
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

然后我确认分析仪配置正确使用:

curl -XGET 'localhost:9200/test/_analyze?analyzer=keyword&text=Expecting many tokens
Run Code Online (Sandbox Code Playgroud)

作为回应,我收到了多个令牌,如exp,expe,expec等.

现在使用Jest客户端我将配置json放到我的类路径上的文件中,内容与上面的PUT请求的主体完全相同.我执行像这样构造的Jest动作:

new CreateIndex.Builder(name)
            .settings(
                    ImmutableSettings.builder()
                            .loadFromClasspath(
                                    "settings.json"
                            ).build().getAsMap()
            ).build();
Run Code Online (Sandbox Code Playgroud)

结果

  • Primo - 使用tcpdump检查实际发布到elasticsearch的内容是(漂亮打印):

    {
      "settings.analysis.filter.keyword_search.max_gram": "15",
      "settings.analysis.filter.keyword_search.min_gram": …
    Run Code Online (Sandbox Code Playgroud)

java elasticsearch jest

4
推荐指数
1
解决办法
2003
查看次数