如何使用JPA和Spring在列表中找到包含字段的不同行?

Pau*_*nel 27 java spring hibernate jpa java-8

我使用Spring连接到数据库.我有一个扩展接口CrudRepository<People, Long>这是我想在db上执行的查询:SELECT DISTINCT name FROM people WHERE name NOT IN UserInputSet.我更愿意在没有任何sql注释的情况下完成它,所以如果没有那么好就可以NOT.

有办法吗?我查看了春季文档,但我找不到任何内容(http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation)


这就是我累了,但它不起作用.

@Query("SELECT DISTINCT name FROM people WHERE name NOT IN (?1)")
List<String> findNonReferencedNames(List<String> names);
Run Code Online (Sandbox Code Playgroud)

这是我得到的例外:

Error creating bean with name 'peopleRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List de.test.tasks.persistence.PeopleRepository.findNonReferencedNames(java.util.List)!
Run Code Online (Sandbox Code Playgroud)

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: people is not mapped [SELECT name FROM people WHERE name NOT IN (?1)]
Run Code Online (Sandbox Code Playgroud)

Pau*_*nel 52

我终于能够找到一个没有@Query注释的简单解决方案.

List<People> findDistinctByNameNotIn(List<String> names);
Run Code Online (Sandbox Code Playgroud)

当然,我得到的是人物而不是弦乐.然后我可以在java中进行更改.

  • 这对您来说可能已经足够了,但我认为这不是在数据库上进行预期的查询.这是获得不同的People实例,而不是name列的不同值.在你的例子中,这是做SELECT DISTINCT*FROM人WHERE名称NOT IN UserInputSet(通常不相同,除非name是主键)因此,根据所需的结果,您可能需要获取不同的名称你得到的人名单. (11认同)
  • 我也有类似的需求。我使用了`List&lt;User&gt; findDistinctByUserName()`,它在启动时抛出`NoSuchElementException`。但是,如果提供参数,它可以正常工作,但不会提供我想要的结果。参数是必填的吗?如何获取不同列的整个表的值? (3认同)

pio*_*oto 13

您是否尝试过重写这样的查询?

@Query("SELECT DISTINCT p.name FROM People p WHERE p.name NOT IN ?1")
List<String> findNonReferencedNames(List<String> names);
Run Code Online (Sandbox Code Playgroud)

注意,我假设你的实体类是命名的People,而不是people.


avi*_*zvi 10

@Query("SELECT DISTINCT name FROM people WHERE name NOT IN (:names)")
List<String> findNonReferencedNames(@Param("names") List<String> names);
Run Code Online (Sandbox Code Playgroud)

  • 我认为你不需要在 `:names` 周围加上括号。 (2认同)

小智 9

@Query("SELECT distinct new com.model.referential.Asset(firefCode,firefDescription) FROM AssetClass ")
List<AssetClass> findDistinctAsset();
Run Code Online (Sandbox Code Playgroud)

  • 由哪个领域区分? (3认同)