【问题标题】:Spring Boot JPA custom query suddenly stopped workingSpring Boot JPA 自定义查询突然停止工作
【发布时间】:2021-03-01 15:17:13
【问题描述】:

所以这很令人沮丧,我开始测试我正在实施的会话系统,我只使用会话变量,没有更改我的数据库、模型或存储库中的任何内容,并且突然间 JPA 停止识别我的表.我收到以下错误:

“字段列表”中的未知列“t”

当我更改自定义查询以使用我得到的表时

未知表'**_dev.ticket'

这真的很奇怪。一切正常,它只是停止工作。我什至没有重新启动调试会话。

更多参考这里是我的这个函数的存储库代码:

@Query(nativeQuery = true, value = "select t.*, s.name as status, agent.name_surname as assigned, CAST(t.dt_created as VARCHAR(20)) as created from ticket t left join ticket_agent ta on t.id = ta.ticket_id and ta.active = true left join web_users agent on agent.id = ta.agent_id inner join ticket_status ts on t.id = ts.ticket_id and ts.isset inner join status s on ts.status_id = s.id where t.logged_by_id = :clientId and (s.name like :searchStr or t.subject like :searchStr or CAST(t.dt_created as VARCHAR(16)) like :searchStr or (case when agent.name_surname is null then 'Unassigned' else agent.name_surname end) like :searchStr) group by id")
Page<Ticket> findClientTickets(@Param("clientId") long agent, @Param("searchStr") String name, Pageable pageable);

这是我的模型:

@Entity(name = "ticket")
@Table(name = "ticket")
public class Ticket {
   @Id
   @GeneratedValue
   @Column(nullable = false)
   private long id;
   @Column(nullable = false)
   private String subject;
   @Column(nullable = false, length = 512)
   private String description;
   @Column()
   private String affected;
   @OneToOne
   @JoinColumn(name = "logged_by_id", nullable = false)
   private WebUser loggedBy;
   @Column(length = 1024)
   private String resolution;
   @Column(name = "dt_created", nullable = false)
   private Date created;
   @Column(name = "dt_resolved")
   private Date Resolved;
   @Column(name = "dt_closed")
   private Date Closed;
   @OneToOne
   @JoinColumn()
   private Thread thread;
   @OneToMany
   @JoinColumn(name = "ticket_id")
   private List<TicketAgent> ticketAgent = new ArrayList<>();
   @OneToMany
   @JoinColumn(name = "ticket_id")
   private List<TicketStatus> ticketStatus = new ArrayList<>();
   @ManyToOne
   @JoinColumn(nullable = false)
   private ServiceType service;
   @OneToMany
   @JoinColumn(name = "ticket_id")
   private List<TicketAttachment> ticketAttachment = new ArrayList<>();
   @ManyToOne
   @JoinColumn()
   private ClientAddress address;
   @ManyToOne
   @JoinColumn()
   private SLA sla;
   @Column(name = "is_billable", nullable = false)
   private boolean isBillable;
   @Column(name = "is_onsite", nullable = false)
   private boolean isOnsite;
   @Column(nullable = false)
   private int priority;
   @OneToMany
   @JoinColumn(name = "ticket_id")
   private List<TicketNote> notes = new ArrayList<>();
   public Ticket(){
   }
   public long getId(){
       return this.id;
   }
   public String getSubject(){
       return this.subject;
   }
   public String getDescription(){
       return this.description;
   }
   public String getAffected(){
       return this.affected;
   }
   public WebUser getLoggedBy(){
       return this.loggedBy;
   }
   public String getResolution(){
       return this.resolution;
   }
   public Date getResolved(){
       return this.Resolved;
   }
   public Date getClosed(){
       return this.Closed;
   }
   public Thread getThread(){
       return this.thread;
   }
   public List<TicketAgent> getTicketAgent(){
       return this.ticketAgent;
   }
   public List<TicketStatus> getTicketStatus(){
       return this.ticketStatus;
   }
   public ServiceType getService(){
       return this.service;
   }
   public List<TicketAttachment> getTicketAttachment(){
       return this.ticketAttachment;
   }
   public ClientAddress getAddress(){
       return this.address;
   }
   public SLA getSla(){
       return this.sla;
   }
   public boolean isBillable(){
       return this.isBillable;
   }
   public boolean isOnsite(){
       return this.isOnsite;
   }
   public int getPriority(){
       return this.priority;
   }
   public List<TicketNote> getNotes(){
       return this.notes;
   }
   public void setSubject(String subject){
       this.subject = subject;
   }

   public void setDescription(String description){
       this.description = description;
   }

   public void setAffected(String affected){
       this.affected = affected;
   }

   public void setLoggedBy(WebUser loggedBy){
       this.loggedBy = loggedBy;
   }

   public void setResolution(String resolution){
       this.resolution = resolution;
   }

   public void setResolved(Date Resolved){
       this.Resolved = Resolved;
   }

   public void setClosed(Date Closed){
       this.Closed = Closed;
   }

   public void setThread(Thread thread){
       this.thread = thread;
   }

   public void setService(ServiceType service){
       this.service = service;
   }

   public void setAddress(ClientAddress address){
       this.address = address;
   }

   public void setSla(SLA sla){
       this.sla = sla;
   }

   public void setIsBillable(boolean isBillable){
       this.isBillable = isBillable;
   }

   public void setIsOnsite(boolean isOnsite){
       this.isOnsite = isOnsite;
   }

   public void setPriority(int priority){
       this.priority = priority;
   }

   public void setNotes(List<TicketNote> notes){
       this.notes = notes;
   }

//CODE_START

   public void addAttachment(String filepath) {
       TicketAttachment ticketAttachment = new TicketAttachment(this, filepath);
       if (this.ticketAttachment == null) {
           this.ticketAttachment = new ArrayList<>();
       }
       this.ticketAttachment.add(ticketAttachment);
   }

   public TicketStatus getStatus() {
       long maxDate = 0;
       TicketStatus mostRecentTicketStatus = null;

       for (TicketStatus ticketStatus : this.ticketStatus) {
           long time = ticketStatus.getCreated().getTime();
           if (time > maxDate && ticketStatus.isSet()) {
               maxDate = time;
               mostRecentTicketStatus = ticketStatus;
           }
       }
       return mostRecentTicketStatus;
   }

   public String getTicketClass() {
       TicketStatus latestTicket = getStatus();

       if (latestTicket == null) {
           return "badge badge-warning";
       }

       Status status = latestTicket.getStatus();
       int id = status.getColor();

       switch (id) {
           case 0:
               return "badge badge-info";
           case 1:
               return "badge badge-danger";
           case 2:
               return "badge badge-primary";
           case 3:
               return "badge badge-success";
           default:
               return "badge badge-success";
       }
   }

   public String getCreated() {
       SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd : HH:mm");
       return simpleDateFormat.format(created);
   }

   public WebUser getAgent() {
       for (TicketAgent agent : ticketAgent) {
           if (agent.isActive())
               return agent.getAgent();
       }
       return null;
   }

   public boolean hasAgent(){
       return getAgent() != null;
   }

   public void create() {
       if (this.created == null)
           this.created = new Date();
   }

} 

谁能给我解释一下这是怎么发生的,也许是为什么? 该表确实存在于数据库中,如果我复制并粘贴原始 sql,我也会从数据库中获得有效结果(OUTSIDE SPRING BOOT 和 JPA)

我现在可能很愚蠢,但我找不到任何与我的问题非常相似的东西。 如果我更改了数据库、模型或存储库中的某些内容,我会理解的,但我没有。

它刚刚开始出现。

我做错了吗?请帮忙。

更新***

如果我以另一个用户身份登录,即使我使用完全相同的参数,一切都会再次神奇地工作...... 这必须是一个缓存问题。谁能告诉我如何清除所有缓存,包括tomcat。

【问题讨论】:

  • 所以我有点弄清楚出了什么问题。 JPA 不再使用我的通配符了。我现在要尝试手动添加所有字段。
  • 不,它不起作用。

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


【解决方案1】:

所以,我仍然不知道问题是什么,如果有人知道,请告诉我。这很奇怪。似乎数据库或 JPA 已损坏,我不得不删除整个数据库,并且由于某种原因它现在似乎可以工作。再一次,如果有人知道我将来如何防止这种情况发生,请告诉我,因为我现在担心如果我使用这个应用程序会发生什么。

更新** 所以我发现这是一个缓存问题,由于某种原因,当我在终端中运行 mvn clean 时它无法正常工作,所以我必须手动转到 maven 选项卡并运行 clean 生命周期,这解决了很多奇怪的事情发生了,我觉得自己没有早点意识到这一点很愚蠢。

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2020-07-05
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多