【问题标题】:Spring Data JPA: No property found for type (Field name contains query method predicate keywords)Spring Data JPA:找不到类型的属性(字段名称包含查询方法谓词关键字)
【发布时间】:2021-05-07 14:45:16
【问题描述】:

所以我一直在努力解决这个错误。所以我得到了一个非常标准的错误,我明白它告诉我什么我只是不明白它是如何得到这个错误的。所以这里是错误

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property stored found for type StorageItemEntity! Did you mean 'storedIn'?
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:90) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:437) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:413) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at org.springframework.data.mapping.PropertyPath.lambda$from$0(PropertyPath.java:366) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:330) ~[na:na]
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:348) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:331) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:81) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at org.springframework.data.repository.query.parser.PartTree$OrPart.lambda$new$0(PartTree.java:249) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) ~[na:na]
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:250) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at org.springframework.data.repository.query.parser.PartTree$Predicate.lambda$new$0(PartTree.java:383) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) ~[na:na]
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:384) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:95) ~[spring-data-commons-2.4.8.jar:2.4.8]
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:89) ~[spring-data-jpa-2.4.8.jar:2.4.8]
    ... 62 common frames omitted

那么标准错误对吗?好的,所以它告诉我没有为我的实体找到“存储”的属性。有道理,但我似乎无法理解为什么,因为我没有定义存储。好吧,这是一个搞砸一切的查询

@Repository
public interface StorageItemDao extends JpaRepository<StorageItemEntity, Long> {
    
    // All other methods omitted for sake of keeping it short
    public List<StorageItemEntity> findAllByStoredIn(StorageType storedIn);

}

这里是 StorageItemEntity 类

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

    /**
     * 
     */
    private static final long serialVersionUID = -5373908574936516693L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;
    
    @NotEmpty(message = "Storage item name can not be empty")
    @Size(max = 100, message = "Storage item name can not exceed 100 characters")
    @Column(name = "name")
    private String name;
    
    @Range(min = 0, message = "Amount in storage can not be less than 0")
    @Column(name = "amount")
    private int amount;
    
    @Range(min = 0, message = "Amount expected in storage per week can not be less than 0")
    @Column(name = "amount_expected")
    private int amountExpected;
    
    @NotNull(message = "Storage in type can not be empty")
    @Column(name = "stored_in")
    private StorageType storedIn;
    
    @Size(max = 500, message = Constants.ADDITIONAL_INFO_EXCEED)
    @Column(name = "additional_info")
    private String additionalInfo;
    
    @NotNull(message = "You need to have a vendor associated to this item")
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "vendor_id", referencedColumnName="id")
    private VendorEntity vendor;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "type_of_storage_id", referencedColumnName="id")
    private TypeOfStorageEntity typeOfStorage;

    // All getters, setters, and constructors are omitted
}

我还想指出,StorageType 是一个非常标准的枚举。这不是错误,但这是一个很好的说明,以防万一。那么,如果我从未在我的 JPA 方法中定义说存储,为什么我会得到“没有找到类型 StorageItemEntity 的属性‘存储’”?

谢谢

【问题讨论】:

  • 您的 stored_in 的列名称似乎是 storedIn
  • 我同意这就是为什么我在 JPA 存储库中将我的函数命名为 findAllByStoredIn
  • 我猜问题是“findByStoredIn”中的“In”是query keyword
  • @samabcde 这实际上是一个非常好的观点。我没想到。是的,这绝对是原因

标签: java spring-boot jpa spring-data-jpa


【解决方案1】:

看起来 In 是 Spring 查询派生使用的关键字。所以它需要一个stored 属性,它是参数中提供的In 值。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#appendix.query.method.predicate

你需要使用@Query注解才能得到你想要的。

【讨论】:

  • 是的,这是问题所在,那是我的错。我更改了我的变量名称,因为最好完全避免使用该关键字,这样我就可以使我的变量更有意义
【解决方案2】:

我认为是JPA模型中列名和变量名的问题, 如果你想使用 findAllByStoredIn,你可以像这样使用 @Query 注释。

Repository 类如

@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {
      
    @Query("SELECT a FROM Account a WHERE a.userName = :username")
    Account findByUsername(@Param("username") String username);
}

和 Model 类一样

@Getter
@Setter
@RequiredArgsConstructor
@Entity
@Table(name = "account")
public class Account {

    @Id
    @GeneratedValue
    @Column(name="user_id")
    private Long userId;

    @NotNull
    @UniqueUsername(message="Username already exists")
    @Size(min = 6, max = 255, message = "Username have to be grater than 6 characters")
    @Column(name="user_name",unique = true)
    private String userName;

    }

【讨论】:

  • 这对于任何寻找的人来说也是一个很好的答案
猜你喜欢
  • 2020-09-13
  • 1970-01-01
  • 2020-07-15
  • 2020-06-29
  • 2011-08-30
  • 2015-01-30
  • 2020-02-24
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多