【问题标题】:WHERE conditional queries without using string不使用字符串的 WHERE 条件查询
【发布时间】:2021-12-09 16:33:59
【问题描述】:

我必须在通过 POST 请求发送的address_table 中返回与其 City 对应的 State。我在查询中使用了WHERE 子句,但它需要一个字符串。如果我希望它包含从AddressManager 中的方法返回的城市,我该怎么办?

如果作为发布请求发送的城市是我在WHERE a.city = '' 中输入的内容,则此代码有效

存储库

@Repository
public interface AddressRepository extends JpaRepository<Address, Long>
{       
    @Query("SELECT a.state FROM address_table a WHERE a.city = '' ") 
    String getState();
    // the blank city should be the city from user.setCity (ua.getCity())
}

经理

@Component 
public class AddressManager
{
    @Autowired
    private AddressRepository aRepo;

    @Autowired
    private UserRepository uRepo    

    public void save(UserAddressDto ua)
    {               
        User user = new User();
            
        user.setCity (ua.getCity());
        user.setState(aRepo.getState());
                    
        uRepo.save(user);
    }
}

【问题讨论】:

  • 我认为在您的@Query 中,您正在混合 jpa 和本机 SQL。你要写什么样的声明?如果是 JPA,您还应该发布实体代码,例如AddressCity 等。如果它是一个 SQL 查询,你应该发布你的数据库表结构,例如address_table 和城市表

标签: java spring-data-jpa jpql


【解决方案1】:

如果city 是一个字符串,那么:

AddressRepository

@Query("SELECT a.state FROM address_table a WHERE a.city = :city ", nativeQuery = true) 
String getState(@Param("city") String city);

地址管理器

user.setCity (ua.getCity());
user.setState(aRepo.getState(ua.getCity()));

【讨论】:

    【解决方案2】:

    考虑到几个州可能有同名城市,使用带有命名参数的 JPQL 查询看起来像这样:

    @Repository
    public interface AddressRepository extends JpaRepository<Address, Long>
    {       
        @Query("SELECT a.state FROM Address a WHERE a.city = :city ")
        List<String> getState(@Param("city") String city);
    }
    

    至于条件,可以使用CASE ... END类似的方式实现:

        @Query("SELECT a.state FROM Address a WHERE a.city = (CASE :city = '' THEN :userCity ELSE :city END) ") 
        List<String> getState(
            @Param("city") String city,
            @Param("userCity") String userCity
        );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2014-02-09
      • 2014-04-19
      • 1970-01-01
      相关资源
      最近更新 更多