如何使用可选 return 在 Spring Jpa 存储库中使 Jpql 查询工作?
How to make a Jpql query work in Spring Jpa Repository with Optional return?
我在我的 JpaRepository 中使用 Jpql 查询。问题是每次我调用带有可选 return 的方法时,我都会收到此错误:
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast
to class com.netpos.pagvendas.campaignuser.entity.CampaignUser
([Ljava.lang.Object; is in module java.base of loader 'bootstrap';
com.netpos.pagvendas.campaignuser.entity.CampaignUser is in unnamed
module of loader
org.springframework.boot.devtools.restart.classloader.RestartClassLoader
@1c069e07)
这是我的存储库 class,我尝试使用的方法是:
findByCampaignCodUniqueCampaignAndCodTenant(String codUniqueCampaign, String codTenant)
@Repository
public interface CampaignUserRepository extends JpaRepository<CampaignUser, CampaignUserPk> {
@Query("SELECT campaignUser, campaignUser.campaign from CampaignUser campaignUser " +
"where campaignUser.codTenant = :codTenant " +
"and campaignUser.flgFinished = false " +
"and :now >= campaignUser.campaign.datStart and :now <= campaignUser.campaign.datEnd " +
"order by campaignUser.datCreation ASC")
List<CampaignUser> findActiveCampaign(String codTenant, ZonedDateTime now);
@Query("SELECT campaignUser, campaignUser.campaign from CampaignUser campaignUser " +
"where campaignUser.idtCampaign = :idtCampaign ")
List<CampaignUser> findByIdtCampaign(long idtCampaign);
@Query("SELECT campaignUser, campaignUser.campaign from CampaignUser campaignUser " +
"where campaignUser.campaign.codUniqueCampaign = :codUniqueCampaign " +
"and campaignUser.codTenant = :codTenant")
Optional<CampaignUser> findByCampaignCodUniqueCampaignAndCodTenant(String codUniqueCampaign, String codTenant);
}
是否可以在 JpaRepository 中使用 Optional 和 Jpql 查询?
为什么选择中有两个对象?要通过单个查询使用 Campaign
加载 CampaignUser
,您必须以这种方式开始查询
select campaignUser from CampaignUser campaignUser join fetch campaignUser.campaign campaign
甚至
from CampaignUser campaignUser join fetch campaignUser.campaign campaign
@Query("SELECT campaignUser from CampaignUser campaignUser join fetch campaignUser.campaign campaign " +
"where campaign.codUniqueCampaign = :codUniqueCampaign " +
"and campaignUser.codTenant = :codTenant")
Optional<CampaignUser> findByCampaignCodUniqueCampaignAndCodTenant(String codUniqueCampaign, String codTenant);
我在我的 JpaRepository 中使用 Jpql 查询。问题是每次我调用带有可选 return 的方法时,我都会收到此错误:
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class com.netpos.pagvendas.campaignuser.entity.CampaignUser ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; com.netpos.pagvendas.campaignuser.entity.CampaignUser is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @1c069e07)
这是我的存储库 class,我尝试使用的方法是:
findByCampaignCodUniqueCampaignAndCodTenant(String codUniqueCampaign, String codTenant)
@Repository
public interface CampaignUserRepository extends JpaRepository<CampaignUser, CampaignUserPk> {
@Query("SELECT campaignUser, campaignUser.campaign from CampaignUser campaignUser " +
"where campaignUser.codTenant = :codTenant " +
"and campaignUser.flgFinished = false " +
"and :now >= campaignUser.campaign.datStart and :now <= campaignUser.campaign.datEnd " +
"order by campaignUser.datCreation ASC")
List<CampaignUser> findActiveCampaign(String codTenant, ZonedDateTime now);
@Query("SELECT campaignUser, campaignUser.campaign from CampaignUser campaignUser " +
"where campaignUser.idtCampaign = :idtCampaign ")
List<CampaignUser> findByIdtCampaign(long idtCampaign);
@Query("SELECT campaignUser, campaignUser.campaign from CampaignUser campaignUser " +
"where campaignUser.campaign.codUniqueCampaign = :codUniqueCampaign " +
"and campaignUser.codTenant = :codTenant")
Optional<CampaignUser> findByCampaignCodUniqueCampaignAndCodTenant(String codUniqueCampaign, String codTenant);
}
是否可以在 JpaRepository 中使用 Optional 和 Jpql 查询?
为什么选择中有两个对象?要通过单个查询使用 Campaign
加载 CampaignUser
,您必须以这种方式开始查询
select campaignUser from CampaignUser campaignUser join fetch campaignUser.campaign campaign
甚至
from CampaignUser campaignUser join fetch campaignUser.campaign campaign
@Query("SELECT campaignUser from CampaignUser campaignUser join fetch campaignUser.campaign campaign " +
"where campaign.codUniqueCampaign = :codUniqueCampaign " +
"and campaignUser.codTenant = :codTenant")
Optional<CampaignUser> findByCampaignCodUniqueCampaignAndCodTenant(String codUniqueCampaign, String codTenant);