我正在尝试使用以下方式更新“ PA49_Debut”列:-第二个表中的“ PA49_Debut”值(如果该产品存在)-如果产品在前几行中存在,则从同一表中返回“ PA49_Debut”-否则来自同一表的“ PA49_Actuel”看看存储库中的代码
public interface FSrepository extends JpaRepository<FSmodel, String> {
@Transactional
@Modifying
@Query("Update FSmodel FS Set FS.PA49_Debut = CASE WHEN EXISTES (SELECT 1 FROM ISmodel SI where FS.Partnumber=SI.Partnumber)" +
" THEN SI.PA49 " +
"WHEN EXISTS (SELECT 1 FROM FSmodel FS2 WHERE FS.Partnumber=FS2.Partnumber AND FS.id>FS2.id )" +
" THEN FS2.PA49_Debut "+
" ELSE (FS.PA49_Actuel) "
+ "END" )
void setPA49Debut(); ```
这些是我的ISmodel和FSmodel实体
@Entity
public class FSmodel {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id;
public String Partnumber;
public String Materialgroup;
public String Warehouse;
public Float Value;
public Float Stock;
public Float PA49_Actuel;
public Float PA49_Debut;
public String article_fg;
public Float Priceperunit;}
@Entity
public class ISmodel {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id;
public String Partnumber;
public String Materialgroup;
public String Warehouse;
public Float Stock;
public Float Value;
public Float PA49;
public Float STPA49; }
这就是错误
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'controller': Unsatisfied dependency expressed through field 'FSrepos'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'FSrepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract void com.example.demo2.repository.FSrepository.setPA49Debut()!
Caused by: java.lang.NullPointerException: null
任何帮助将不胜感激。谢谢。
NullPointerException: null
的解决方案是
尝试@Query(vaue =“您的查询在这里”,nativeQuery = true)
如@stacker所说,但我发现我的代码中有很多错误,我将尽力解释它们,以希望对其他人有所帮助。首先是存在的拼写第二个是在选择语句中使用SI,我通过添加新的选择语句解决了此问题。第三个错误是通过对这些行中的同一张表进行子查询来更新我的表"WHEN EXISTS (SELECT 1 FROM FSmodel FS2 WHERE FS.Partnumber=FS2.Partnumber AND FS.id>FS2.id )" +
" THEN FS2.PA49_Debut "
我找到了解决方案以及解释here最后,这是我的最终代码,效果很好@Transactional
@Modifying
@Query(value="Update FSmodel FS Set FS.PA49_Debut = CASE" +
" WHEN exists(SELECT SI.Partnumber FROM ISmodel SI where FS.Partnumber=SI.Partnumber)"
+ " THEN (select distinct S.PA49 from ISmodel S where FS.Partnumber=S.Partnumber)" +
"WHEN exists(SELECT 1 FroM (SELECT * FROM FSmodel) AS FSd WHERE FS.Partnumber=FSd.Partnumber AND FS.id>FSd.id )"
+ " THEN (select distinct F.PA49_Debut from (SELECT * FROM FSmodel) AS F where FS.Partnumber=F.Partnumber AND FS.id>F.id)+1" +
" ELSE (FS.PA49_Actuel )" + "END",nativeQuery = true)
void setPA49Debut();