当前位置: 首页 > 知识库问答 >
问题:

spring-data-jpa存储库在查询中使用Collection作为@param

谷良弼
2023-03-14

我在通过使用spring data jpa存储库执行自定义查询时遇到了一个问题。

@Query Annited方法没有指定列表<>类型的parametr。

以下是实体类:

@Entity
@Table(name = "\"user\"")
public class User {
  @Id
  @GeneratedValue(generator = "increment")
  private long id;

  @Column(unique = true, nullable = false)
  private String mail;

  @ManyToMany(targetEntity = Interest.class, mappedBy = "users")
  private List<Interest> interests = new ArrayList<Interest>();
  ...
  ... setters and getters.

@Entity
@Table(name = "interest")
public class Interest {
  @Id
  @Column(name = "interest_name", nullable = false, unique = true)
  private String name;

  @ManyToMany(targetEntity = User.class, fetch = FetchType.LAZY)
  private List<User> users = new ArrayList<User>();
  ...
  ... setters and getters.

以下是查询:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
  @Query("select distinct u from User u where u <> :currentUser and
         u.interests in :currentInterests")
  List<User> getUsersWithSameInterests(@Param("currentUser") User user,
         @Param("currentInterests") List<Interest> interests);
}

我用这个像:

@Autowired
private UserRepository userRepository;
  @Override
  public List<User> getUsersWithSameInterests(User user) {
    return userRepository.getUsersWithSameInterests(user, user.getInterests());
  }

但是得到了

org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
.
.
.
Caused by: java.sql.SQLException: No value specified for parameter 2
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2205)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2185)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2115)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1936)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:83)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:83)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
... 73 more

没有为参数2指定值,尽管第2个参数具有有效值

共有1个答案

单品
2023-03-14
   Change the code as per below:

   Old Code:

   `@Repository
   public interface UserRepository extends JpaRepository<User, Long> {
   @Query("select distinct u from User u where u <> :currentUser and
         u.interests in :currentInterests")
   List<User> getUsersWithSameInterests(@Param("currentUser") User user,
         @Param("currentInterests") List<Interest> interests);
   }`

   Updated Code:

   `@Repository
   public interface UserRepository extends JpaRepository<User, Long> {
   @Query("select distinct u from User u where u.user :currentUser 
           and u.interests in :currentInterests")
   List<User> getUsersWithSameInterests(@Param("currentUser") User user,
         @Param("currentInterests") List<Interest> interests);
  }`    
 类似资料:
  • 我想在中编写一个类似的查询,但它没有返回任何内容: -它不起作用。 一样完美。 以下是我的代码:

  • 问题内容: 我有许多需要保留到数据库的简单对象类型。我正在使用Spring JPA来管理这种持久性。对于每种对象类型,我需要构建以下内容: 在我看来,有可能用三个基于泛型的类替换每种对象类型的多个类,从而节省了大量的样板代码。我不确定该怎么做,实际上,如果这是个好主意? 问题答案: 首先,我知道我们在这里提高了一些标准,但这已经比没有Spring Data JPA的帮助而编写的代码少得多。 其次,

  • 问题内容: 我正在使用Spring Data JPA(以Hibernate作为我的JPA提供程序),并且想定义一个附加了HQL查询的方法: 当我运行此查询时,我得到一个。 如何使HQL查询看起来有效?我知道我可以简单地返回Long值,然后在Java代码中检查if ,但是这种解决方法不是必需的,对吧? 问题答案: 我认为您可以简单地更改查询以将布尔值返回为 PS:如果您要检查是否存在基于主键值的已有

  • 目前我一直在使用以下Spring JPA存储库自定义查询, 我需要修改这个查询时,筛选文本将是逗号分隔的值。但按照以下方式,它将是一个动态查询,我如何执行它。 我需要构建动态查询,

  • 我在我的Web应用程序中使用spring data jpa,我有实体用户 postgresql中的表

  • 我正在构建一个使用Spring data jpa特性的Spring-boot应用程序。 请在我的dao层代码下面找到 我正在使用一个DaoProvider类,如下所示: 我的spring boot主类定义如下: 现在,在运行时,我得到以下异常: