我正在使用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的强大功能?
我有一个以下的存储库:
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) 您是否知道Apache Commons Validate或Guava 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
Jest为elasticsearch提供了一个出色的异步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)