簡體   English   中英

Class 在 clojure 中拋出異常

[英]Class cast exception in clojure

獲取clojure.core$count cannot be cast to java.lang.Number error for defined variable count

(defroutes jobs-routes
      (context "/jobs" []
        (POST "/jobValidation" [name status req]  (insert-job jobName jobStatus req)))

在這種方法中,我定義了一個變量count來存儲查詢中的總計數值

(defn insert-job [jobName jobStatus req]
   (let [count (db/insert-job {:job-name name :status status})])
    (when (> count 0) (println (format "true" )))
    (insert-job req) ; 
)

查詢:數據庫/插入作業

-- :name insert-jobWithValidation :? :*
SELECT count(*)  FROM job_history WHERE job_name = :job-name and status = :status

問題我想檢查是否如果我得到的值大於 0,那么我可以打印任何東西,如果計數是任何正值,那么我可以執行一些新的事情

你的let塊沒有主體,你在定義向量之后立即關閉它:

(let [count (db/insert-job {:job-name name:status status})])

請注意,您在這里隱藏了核心 function count

所以當你調用這一行: (when (> count 0) (println (format "true" )))時, count的值為count function:

count
=> #object[clojure.core$count 0x69c6a700 "clojure.core$count@69c6a700"]
(> count 0)
Execution error (ClassCastException)
class clojure.core$count cannot be cast to class java.lang.Number

還有一些其他錯誤和樣式不准確:

  • 變量的名稱不匹配( jobName jobStatus vs name status
  • 你只用一個參數調用(insert-job req) ,但是這個 function 有三個
  • (>... 0)pos?
  • (format "true")就是"true"

可能的修復(也許你仍然需要以某種方式修改它):

(defn insert-job [job-name job-status req]
  (let [my-count (db/insert-job {:job-name job-name :status job-status})]
    (if (pos? my-count)
      (println "true")
      (insert-job job-name job-status req)))) 

這可能是因為您的hugsql查詢 header:

:? :* :? :* - 返回行集,它不是數字。 也許:? :1 :? :1在這里會更合適。 無論如何,查詢不返回count(*) ,而是返回一個哈希映射(如果是:1)或一個 hashmap 的列表(如果是:*),您仍然需要檢索該值從那里。

類似的東西(未經測試):

-- :name insert-jobWithValidation :? :1
SELECT count(*) as amount  FROM job_history WHERE job_name = :job-name and status = :status
(defn insert-job [name status req]
  (let [res (db/insert-job {:job-name name :status status})]
    (when (-> res :amount pos?) 
      (println true))
    (insert-job req)))

UPD :我的天啊,確實沒有身體,@MartinPůda,謝謝)

我會說,你想要的是這樣的:

-- :name count-jobs-by-name-and-status :? :1
SELECT count(*) as amount  FROM job_history WHERE job_name = :job-name and status = :status
(defn insert-job-if-not-exists [name status req]
  (if (->> {:job-name name :status status}
           db/count-jobs-by-name-and-status
           :amount
           pos?)
    (println "job already exists")
    (insert-job req)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM