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

来自JPararePository接口的查询

娄嘉石
2023-03-14

这个问题是关于一个Spring MVC项目的,在这个项目中,我确实将Hibernate与JPA一起使用。对于消息是一个实体类

import java.io.Serializable;
import java.time.LocalDate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "StoredMessage")
public class StoredMessage implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long messageId;
    @Column(nullable = false)
    private Long userId;
    @Column(nullable = false)
    private String message;
    @Column(nullable = false)
    private LocalDate date;
    @ManyToOne
    private User user;

    public StoredMessage() {
       super();
    }

   public StoredMessage(Long messageId, Long userId, String message, LocalDate date) {
      super();
      this.messageId = messageId;
      this.userId = userId;
      this.message = message;
      this.date = date;
  }

  public Long getMessageId() {
      return messageId;
  }

  public void setId(Long messageId) {
      this.messageId = messageId;
  }

  public Long getUserId() {
      return userId;
  }

  public void setUserId(Long userId) {
      this.userId = userId;
  }

  public String getMessage() {
      return message;
  }

  public void setMessage(String message) {
      this.message = message;
  }

  public LocalDate getDate() {
      return date;
  }

  public void setDate(LocalDate date) {
      this.date = date;
  }

}

为了执行一些简单的查询,使用了一个从JPararePository派生的接口。

import org.springframework.data.jpa.repository.JpaRepository;

import free.oauth.model.StoredMessage;

public interface MessageRepository extends JpaRepository<StoredMessage,  Long> {

    public void saveStoredMessage(StoredMessage message);

    public void delete(Long MessageId);

    public boolean findByMessageId(Long mesageId);

    public StoredMessage findStoredMessageByMessageId(Long mesageId);

    public boolean update(StoredMessage mesage);
}

通过运行project its获取错误,如

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property saveStoredMessage found for type StoredMessage!
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:77)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:272)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:243)
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:76)
at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:235)
at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:373)
at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:353)
at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:84)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:63)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:103)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:214)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:77)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:435)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:220)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:266)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:252)
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 56 more

这种接口有什么问题,在这种类型的接口中必须遵守规则?

共有1个答案

诸葛阳成
2023-03-14

关于保存和删除,它们是开箱即用的支持,并且已经存在于界面中:

void delete(T entity)
<S extends T> S save(S entity)

这两个都定义在JpaRepository扩展的CrudRepository接口上。

关于update,在事务完成后,对查询的任何更新都将被刷新到数据库中。

如果您想要显式更新,那么试试下面的文章:How do I update an entity using spring-data-jpa?

更新

取而代之的是:

public StoredMessage findStoredMessageByMessageId(Long mesageId);

您可以使用

StoredMessage findOne(long messageId)

也来自CrudRepository接口

最后,如果您想通过某个字段而不是id来搜索唯一的实体,那么如下所示:

StoredMessage findOneStoredMessageByMessage(String message);
 类似资料:
  • 问题内容: 我正在尝试从C#查询SQL Server数据库 我有课 我的查询中有问题。 当我给普通查询“从表中选择*”时,这给了我完美的结果。 但是当我尝试给出条件时,它给了我错误。有什么建议可以解决吗?谢谢。 问题答案: 钿狅笍 警告 此答案包含一个SQL注入安全漏洞。不要使用它。如该问题的其他一些答案所述(例如,Tony Hopkinson的答案),请考虑使用参数化查询。 尝试在where子句

  • 问题内容: 该表包含一个ID列,valueHeading列和一个value列。我想将value列分为两个新列,分别称为valueHeading1和valueHeading2,具体取决于值具有哪种valueHeading类型。 所以我想加入这个选择: 编辑:完全加入 使用此选择: 在各自的ID上。我该怎么做呢? 编辑 以说明我要执行的操作: 原始表格: 新表: 问题答案: 在SQLServer200

  • 我在文件夹中: 其中保留了一些简单的X查询STMT,以便通过Saxon X查询引擎执行...(Saxon 9.4 HE) 以下声明: 给出: 但下面的语句很管用: ?!?! 与类加载器有关..??许可..??小天鹅?嗯... 非常感谢你指出这个小天鹅的行为! 但奇怪的是,当我也试图通过我的Eclipse(Indigo)在Mac OS Lion上运行Xquery时,我遇到了这个(与上面完全相同),通

  • 我有一个JAX-WS导入的WSDL客户机。当我尝试连接到webserviceendpoint时,JAX-WS客户端尝试加载WSDL。为什么? 我不想在我的项目中存储WSDL, 我不想再次从webservice URL加载WSDL? 问题: 有机会绕过这种行为吗? 如何在运行时添加webserviceendpointURL? 添加具有相同QName和端口名的端口失败,因为我无法添加相同的QName和

  • 如果可能的话,我想使用一个自定义函数来对结果进行排序。在Spring JPA中处理这类事情的最佳方法是什么?我如何使我的存储库使用我的函数对结果集进行排序?