我可以在 JPA 中查询一个对象吗

Posted

技术标签:

【中文标题】我可以在 JPA 中查询一个对象吗【英文标题】:Can I query an object in JPA 【发布时间】:2015-08-07 10:58:40 【问题描述】:

我正在使用 JPA 和 Spring Data,

有一个包含UserDetail createdBy 字段的类事件,我想查询由指定用户创建的事件。这是我的查询

@Query("SELECT e FROM  event WHERE e.created_by = :userdetail")
    Collection<Event> getEventsCreatedByUser(@Param("userdetail")UserDetail user);

当我在 Dao 类中使用此查询启动测试时,我收到错误 org.hibernate.hql.internal.ast.QuerySyntaxException: event is not mapped [SELECT e FROM event WHERE e.created_by = :userdetail]

这里是实体类,created_by 在 BaseEntityAudit 中,我测试了同样扩展 BaseEntityAudit 的 User 类,它工作得很好,pgadmin 还显示列 createdBy 存在于事件表中

@Entity
@Table(name = "Event")
@AttributeOverride(name = "id", column = @Column(name = "event_id",
        nullable = false, columnDefinition = "bigserial"))
public class Event extends BaseEntityAudit 
    @Embedded
    private Point point;    
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "event_comments")
    private Collection<Comment> comments = new ArrayList<Comment>();
    @OneToMany
    @JoinTable(name = "\"users_tagged_at_event\"")
    private Collection<UserDetail> usersTagged = new ArrayList<UserDetail>();    
    public Event(UserDetail createdBy, Point point) 
        super();
        this.point = point;
        setCreatedBy(createdBy);
    

还有 BaseEntityAudit

public abstract class BaseEntityAudit extends BaseEntity 
    @Column(name = "created_at")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdAt;
    @Column(name = "created_by", length = 20)
    private UserDetail createdBy;
    @Column(name = "updated_at")
    @Temporal(TemporalType.TIMESTAMP)
    private Date updatedAt;
    @Column(name = "updated_by", length = 20)
    private UserDetail updatedBy;
//geters/setters ...
    /**
     * Sets createdAt before insert
     */
    @PrePersist
    public void setCreationDate() 
        this.createdAt = new Date();
   
    /**
     * Sets updatedAt before update
     */
    @PreUpdate
    public void setChangeDate() 
        this.updatedAt = new Date();
    

更新

Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: created_by of: home.map.events.entity.Event [SELECT e FROM  home.map.events.entity.Event e WHERE e.created_by = :userdetail]

【问题讨论】:

发布event实体类。 你没有字段“created_by”...你有“createdBy”!!! @NeilStockton 在更新时已经这样做了... 不,您没有,因为如果您这样做了,您将不会收到该消息......因为您的查询中不会有“created_by”。 @NeilStockton 得到你,谢谢你 【参考方案1】:

你忘了在 from 子句中提到 event e。我猜你有事件表和事件类(由 @pL4Gu33 指出)。所以你需要使用 Event 而不是 event

@Query("SELECT e FROM Event e WHERE e.createdBy = :userdetail")
                use---^     ^- added      ^---- updated

【讨论】:

按照你的建议做了,甚至为表 Im querying, but it didnt 指定了@Table(name = "Event") 工作.. 你的表名和实体名是什么?并发布您的事件实体类。 完成了,这个错误可能是因为字段 created_by 在 BaseEntityAudit 中吗? 在查询中,将其更改为createdBy,而不是created_by 堆栈跟踪:SELECT e FROM home.map.events.entity.Event e WHERE e.created_by = :userdetail 仍然提到 e.created_by 而不是 e.createdBy。检查答案中更新的查询。【参考方案2】:

您的课程是“事件”而不是“事件”,请查看 Naman Gala 的答案。

【讨论】:

以上是关于我可以在 JPA 中查询一个对象吗的主要内容,如果未能解决你的问题,请参考以下文章

当某些字段可以为 NULL 时,我可以使用对象作为 JPA 中条件查询的谓词吗?

Spring Data JPA10 对象导航查询

Spring data jpa删除元素时必须先查询出来吗

java中当表中没有记录,为空的时候,用jpa查询的结果返回的是null吗?

使用对象属性的 JPA 命名查询

Spring data jpa删除元素时必须先查询出来吗