- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在此原型(prototype)中使用 Spring Boot 和 Hibernate 文件数据库。
这是 application.properties 中的一个片段(省略了用户/密码。显然)注意我已将 fave 设置为字符串而不是 boolean 值,因此我可以在查询 DSL 绑定(bind)中使用字符串:
spring.jpa.generate-ddl=true
spring.datasource.url=jdbc:h2:file:~/db
spring.datasource.driver-class-name=org.h2.Driver
hibernate.hbm2ddl.auto=update
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.show_sql=true
这是省略了 City 类的模型,因为它非常简单:
@Data
@AllArgsConstructor
@Entity
@Table(name = "matches")
@EqualsAndHashCode(of = "id")
public class FilterMatch {
@SequenceGenerator(name = "MATCHES_SEQ_GENERATOR", sequenceName = "MATCHES_SEQ",
initialValue = 1, allocationSize = 1)
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "MATCHES_SEQ_GENERATOR")
@Column
private Long id;
@Column
private String fave;
@Column
private int age;
@Column
private int cmHeight;
@Column
private int contactsExchanged;
@Column
private float compatScore;
@Column
private String displayName;
@Column
private String jobTitle;
@Column
private String mainPhoto;
@Column
private String religion;
@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
private City city;
public FilterMatch() {}
// getters/setters omitted
}
这是根据需要扩展 JPARepository 的存储库:
public interface FilterMatchRepository extends JpaRepository<FilterMatch, Long>,
QueryDslPredicateExecutor<FilterMatch>,QuerydslBinderCustomizer<QFilterMatch> {
@Override
default public void customize(QuerydslBindings bindings, QFilterMatch root) {
bindings.bind(String.class)
.first((SingleValueBinding<StringPath, String>) StringExpression::containsIgnoreCase);
bindings.excluding(root.religion,root.jobTitle);
}
}
我的 SearchCriteria 类:
public class SearchCriteria {
private static final Logger logger = LogManager.getLogger(SearchCriteria.class);
private String key;
private String operation;
private Object value;
public SearchCriteria(String key, String operation, Object value) {
this.key = key;
this.operation = operation;
this.value = value;
}
//getters & setters omitted.
}
我的 MatchBuilderPredicates 类和我的 MatchPredicates 类:
public class MatchPredicatesBuilder {
private static final Logger logger = LoggerFactory.getLogger(MatchPredicatesBuilder.class);
private List<SearchCriteria> parameters;
public MatchPredicatesBuilder() {
parameters = new ArrayList<>();
}
public MatchPredicatesBuilder with(String key, String operation, Object value) {
parameters.add(new SearchCriteria(key, operation, value));
return this;
}
public BooleanExpression build() {
if (parameters.size() == 0) {
return null;
}
List<BooleanExpression> predicates = new ArrayList<>();
MatchPredicate predicate;
for (SearchCriteria param : parameters) {
predicate = new MatchPredicate(param);
BooleanExpression expression = predicate.getPredicate();
if (Objects.nonNull(expression)) {
predicates.add(expression);
}
}
BooleanExpression result = predicates.get(0);
for (int i = 1; i < predicates.size(); i++) {
result = result.and(predicates.get(i));
}
return result;
}
}
public class MatchPredicate {
private static final long serialVersionUID = 8621295752447527269L;
private static final Logger logger = LoggerFactory.getLogger(MatchPredicate.class);
private SearchCriteria criteria;
public MatchPredicate(SearchCriteria criteria) {
this.criteria = criteria;
}
public BooleanExpression getPredicate() {
PathBuilder<FilterMatch> entityPath = new PathBuilder<>(FilterMatch.class, "FilterMatch");
if (FilterUtils.isNumeric(criteria.getValue().toString())) {
NumberPath<Double> path = entityPath.getNumber(criteria.getKey(), Double.class);
double value = Double.parseDouble(criteria.getValue().toString());
switch (criteria.getOperation()) {
case ":":
return path.eq(value);
case ">":
return path.goe(value);
case "<":
return path.loe(value);
}
} else {
StringPath path = entityPath.getString(criteria.getKey());
if (criteria.getOperation().equalsIgnoreCase(":")) {
return path.containsIgnoreCase(criteria.getValue().toString());
}
}
return null;
}
}
所以这个集成测试会抛出一个 NPE:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class JpaQueryDslIntegrationTest {
private static final Logger logger = LoggerFactory.getLogger(JpaQueryDslIntegrationTest.class);
@Autowired
private FilterMatchRepository matchRepository;
private FilterMatch match1;
private FilterMatch match2;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
match1 = new FilterMatch();
match1.setDisplayName("Emma");
match1.setAge(40);
match1.setJobTitle("Banker");
match1.setCmHeight(150);
City leeds = new City();
leeds.setName("Leeds");
leeds.setLon(-1.548567);
leeds.setLat(53.801277);
match1.setCity(leeds);
match1.setMainPhoto("http://thecatapi.com/api/images/get?format=src&type=gif");
match1.setCompatScore(0.73f);
match1.setContactsExchanged(0);
match1.setFave(Constants.FALSE.getValue());
match1.setReligion("Christian");
matchRepository.save(match1);
match2 = new FilterMatch();
match2.setDisplayName("Diana");
match2.setAge(44);
match2.setJobTitle("Consultant");
match2.setCmHeight(153);
City london = new City();
london.setName("London");
london.setLat(51.509865);
london.setLon(-0.118092);
match2.setCity(london);
match2.setMainPhoto("http://thecatapi.com/api/images/get?format=src&type=gif");
match2.setCompatScore(0.50f);
match2.setContactsExchanged(0);
match2.setFave(Constants.TRUE.getValue());
match2.setReligion("Atheist");
matchRepository.save(match2);
}
@Test
public final void testMultipleMatch() {
MatchPredicatesBuilder builder = new MatchPredicatesBuilder().with("displayName", ":", "Emma");
Iterable<FilterMatch> results = matchRepository.findAll();
results = matchRepository.findAll(builder.build()); // This is the line that throws the NPE. i've tested and builder.build() isn't null
assertThat(results, Matchers.containsInAnyOrder(match1, match2));
}
}
我打印了 builder.build() 的内容,它是:
containsIc(FilterMatch.displayName,Emma)
这里的堆栈跟踪被删减了一点。 :
java.lang.NullPointerException
at java.lang.String$CaseInsensitiveComparator.compare(String.java:1192)
at java.lang.String$CaseInsensitiveComparator.compare(String.java:1186)
at java.util.TreeMap.getEntryUsingComparator(TreeMap.java:376)
at java.util.TreeMap.getEntry(TreeMap.java:345)
at java.util.TreeMap.get(TreeMap.java:278)
at org.hibernate.dialect.function.SQLFunctionRegistry.findSQLFunction(SQLFunctionRegistry.java:45)
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.findSQLFunction(SessionFactoryHelper.java:369)
at org.hibernate.hql.internal.ast.tree.IdentNode.getDataType(IdentNode.java:374)
at org.hibernate.hql.internal.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:654)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:5003)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1286)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4707)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.functionCall(HqlSqlBaseWalker.java:2733)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1365)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4707)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:4319)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2138)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:815)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:609)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:266)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:553)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
at com.sun.proxy.$Proxy58.createQuery(Unknown Source)
at com.querydsl.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:101)
at com.querydsl.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:94)
at com.querydsl.jpa.impl.AbstractJPAQuery.fetch(AbstractJPAQuery.java:201)
at org.springframework.data.jpa.repository.support.QueryDslJpaRepository.findAll(QueryDslJpaRepository.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:520)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:505)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:477)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
我有几个问题:
1)我的 MatchPredicatesBuilder 返回 BooleanExpression,因为我正在遵循的教程说我应该这样做,但我不知道为什么编译器不会对此感到窒息。我已经查阅了 java 文档,但它仍然是一个谜。
2) 为什么会抛出 NPE? builder.build() 不为空。从堆栈跟踪中很难看出。
最佳答案
最终的答案是,将实体表命名为类本身名称之外的任何其他名称都行不通。当您让 hibernate 自动创建数据库和架构时,就会发生这种情况。
我将 MatchPredicate 类中的行更改为:
PathBuilder<FilterMatch> entityPath = new PathBuilder<>(FilterMatch.class, "FilterMatch");
至:
PathBuilder<FilterMatch> entityPath = new PathBuilder<>(FilterMatch.class, "matches");
这导致了其他异常。所以现在它又回到了小写的“filtermatch”,它现在也与实体类上的表注释名称相同:
@Table(name="filtermatch")
我也改变了:
@SequenceGenerator(name = "MATCHES_SEQ_GENERATOR", sequenceName = "MATCHES_SEQ",
initialValue = 1, allocationSize = 1)
至:
@GenericGenerator(
name = "MATCH_SEQ_GENERATOR",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "MATCH_SEQ"),
@Parameter(name = "initial_value", value = "1"),
@Parameter(name = "increment_size", value = "1")
})
它消除了启动日志中的一些已弃用的错误。
关于java - Spring Query DSL 给出空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48462275/
我们有一个系统,其行为由许多 XML 文件定义。(大约 50 个不同的 XML 文件,每个文件管理子系统的行为。) 出于遗留原因,XML 文件采用自定义格式,旨在方便系统中的各种组件使用。 自定义格式
我发送的 json 请求是: Given url applicationURL And path 'applications' And header Authorization = subscribe
默认情况下,生成的 XText 工件会从我的 DSL 生成代码到默认 socket (默认为 src-gen 文件夹)。我知道您可以在 fsa.generateFile("myfile.txt", "
我的论文主题一般是关于领域特定语言的,我想专注于外部或内部 DSL 的设计或实现,但我什至无法思考或开始,因为我在理解 DSL 的概念方面遇到了问题.. 我已经阅读并收集了很多关于这个问题的论文和调查
我有一个 Xtext 项目和几个示例 DSL 文件。我可以使用“示例 Ecore 模型编辑器”打开这些文件并验证它是否符合 Xtext 生成的元模型。但是,由于 DSL 文件未被识别为 Ecore,我
当我学习一些 DSL 时,我意识到 Rebol 中的 Parse 方言可以是一个很好的词法分析器和解析器。 the Parse tutorial 有一个很好的例子: expr: [ter
我正在考虑使用亚马逊云服务(EC2、S3 等)进行托管。我一直在查看可以指定用于配置各种实例的 JSON 元数据,我担心它的复杂性。是否有一个 dsl 可以生成有效的 JSON 元数据并且更重要的是验
我可能会因为这个而被否决,但无论如何我都会试试运气。 我真的找不到 Elastic Search 查询 DSL 的完整形式“DSL”的任何链接,甚至在 Elastic Search 网站上也找不到 h
这个问题可能是复合的,让我扩展一下: 是否存在设计器( stub /框架/元设计器)来创建基于 .NET 对象公共(public) bool 属性的 AND/OR 规则?保存为任何 DSL/Boo/.
与 anko 一样你可以这样写回调函数: alert { title = "" message = "" yesButton { toast("Yes")
我有一个像下面这样的原始聚合脚本,但是很难将其转换为elasticsearch dsl。 我已阅读该文档并找到描述,说我们可以使用.bucket()、. metric()和.pipeline()方法来
如何将这个 gradle groovy 片段转换为 gradle kotlin dsl 而不是非常冗长? test { systemProperties System.getPropertie
这个问题是 ANY operator with jOOQ 的衍生问题和 Are arrays optimized in jOOQ & PostgreSQL? . 我有一个Field field和Lis
我创建了内部 DSL,并且会重载 DefaultGroovyMethods 中的 any() 方法。 class RulesProcessor { } Any live cell with fewer
我正在尝试使用 Gradle 使用 Kotlin 和 Java 11 构建一个简单的 JavaFX 11 程序,按照说明 here .但是,此页面使用 Gradle 的 Groovy DSL,而我正在
如何将这个 gradle groovy 片段转换为 gradle kotlin dsl 而不是非常冗长? test { systemProperties System.getPropertie
我是 Camel 的新手,我仍在学习它,根据我的理解,你可以在 Spring DSL 中做与 Java DSL 相同的事情。我想知道如何将一种转换为另一种?我经常看到 Java 中的例子,但想要 最佳
我正在尝试通过 Groovy 代码为 Jenkins Job DSL 插件创建 ListView 。运行后, View 已创建,但不会添加任何作业。以下代码段之前的代码创建了构建和部署作业,并且在调用
对于 Jenkins 作业 DSL,我试图为作业选择特定的 ssh 代理(插件)键(在包装器上下文中使用 sshAgent 关键字)。我们安装了 Jenkins ssh 代理插件并设置了几个 key
我必须为非程序员(我们公司的客户)创建一个 DSL,它需要提供一些更高级别的语言功能(循环、条件表达式、变量...... - 所以它不仅仅是一个“简单”的 DSL)。 使用 DSL 应该很容易;人们应
我是一名优秀的程序员,十分优秀!