【问题标题】:CrudRepository filter for String value in List<String> propertyList<String> 属性中字符串值的 CrudRepository 过滤器
【发布时间】:2023-04-06 15:23:01
【问题描述】:

基本上我得到了以下实体(由 Lombok 扩展)

@Getter
@Setter
@Entity("FOO")
public class Foo{

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "ID", unique = true, nullable = false)
     private long id;

     @ManyToOne
     @JoinColumn(name = "FK_FEE", nullable = false)
     private Fee fee;

     @Column(name = "CCCS")
     @Convert(converter = StringListConverter.class)
     private List<String> cccs;
}

还有 StringListConverter:

@Converter
public class StringListConverter implements AttributeConverter<List<String>, String> {
    @Override
    public String convertToDatabaseColumn(final List<String> list) {
        String returnValue = null;
        if (list != null) {
            final List<String> trimmedList = new ArrayList<>();
            for (final String strg : list) {
                if (strg != null && !strg.isEmpty()) {
                    trimmedList.add(strg.trim());
                }
            }
            returnValue = String.join(",", trimmedList);
        }
        return returnValue;
    }

    @Override
    public List<String> convertToEntityAttribute(final String joined) {
        List<String> returnValue = null;
        if (joined != null) {
            returnValue = new ArrayList<>();
            final String[] splitted = joined.split(",");
            for (final String strg : splitted) {
                if (strg != null && !strg.isEmpty()) {
                    returnValue.add(strg.trim());
                }
            }
        }
        return returnValue;
    }
}

现在我想获取Foo 的列表,其中Fee.Id= 123 和Foo.cccs 包含特定的字符串值。

@Repository
public interface FooRepository extends CrudRepository<Foo, Long> {
    List<Foo> findByFeeIdAndCccsIn(Long feeId,  String ccc);
}

但这不起作用。是通过编写自己的查询来解决这个问题的唯一方法吗?

【问题讨论】:

  • findByFeeIdAndCccsContaining(Long feeId, String ccc); 我觉得是这样的
  • 无法为方法 public abstract java.util.List FooRepository.findByFeeIdAndCccsContaining(java.lang.Long,java.lang.String) 创建查询!未知集合表达式类型...
  • 是的...从未使用转换后的列对其进行测试。看来你得写一个查询

标签: java spring-data-jpa data-access-layer


【解决方案1】:

目前似乎唯一的解决方案是使用 @Query 并编写 JPQL 或本机 SQL 查询来获取数据。

String SELECT_BY_FEE_AND_CCC = "Select foo FROM Foo foo "
        + " WHERE foo.fee.id = :feeId AND foo.cccs LIKE CONCAT(CONCAT('%', :ccc) ,'%')";

并附加@Query 注释,如:

@Query(SELECT_BY_FEE_AND_CCC)
List<Foo> findByFeeIdAndCccsContains(@Param("feeId") Long feeId, @Param("ccc") String ccc);

注意/编辑: 有时您必须加入外部表才能访问其属性。

String SELECT_BY_FEE_AND_CCC = "Select foo FROM Foo foo "
        + " JOIN foo.fee fee "
        + " WHERE fee.id = :feeId AND foo.cccs LIKE CONCAT(CONCAT('%', :ccc) ,'%')";

【讨论】:

    【解决方案2】:

    现在我想获取 Fee.Id= 123 和 Foo.cccs 的 Foo 列表 包含特定的字符串值。

    您有特定的要求。根据Spring Data JPA doc,不支持您尝试执行的操作。

    所以您应该使用@Query 来满足您的要求。

    【讨论】:

      【解决方案3】:
      @Repository
      public interface FooRepository extends CrudRepository<Foo, Long> {
              @Query( "Select foo FROM Foo foo WHERE foo.fee.id = :feeId AND foo.cccs LIKE CONCAT(CONCAT('%', :cccs) ,'%')")
              List<Foo> findByFeeIdAndCccsIn(@Param("feeId") Long feeId,@Param("cccs") String ccc);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        相关资源
        最近更新 更多