Hibernate @spring boot中的自动连线JPA存储库

Hibernate @spring boot中的自动连线JPA存储库,hibernate,spring-mvc,spring-boot,spring-data-jpa,autowired,Hibernate,Spring Mvc,Spring Boot,Spring Data Jpa,Autowired,当我尝试构建项目时,@Autowired和我的JpaReposytory类出现问题,问题出现在这里 这是我的Jpa存储库类 public interface IJpaRepositoryLivrariaDAO extends JpaRepository<EntidadeDominio, Long> { List<Cliente> findByCliente(Cliente cliente); // whem I put this line of code I've

当我尝试构建项目时,@Autowired和我的JpaReposytory类出现问题,问题出现在这里

这是我的Jpa存储库类

public interface IJpaRepositoryLivrariaDAO extends JpaRepository<EntidadeDominio, Long> {
    List<Cliente> findByCliente(Cliente cliente); // whem I put this line of code I've get the exeption below                                           
}
这是我的客户类和他的绑定类,以便更好地理解

@Entity
@Component
@DiscriminatorValue("Cliente")
public class Cliente extends EntidadeDominio {

    @Embedded
    private Genero genero;
    private boolean ativo;

    @OneToMany(mappedBy = "cliente", targetEntity = CartaoCredito.class, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<CartaoCredito> cartaoCredito = new ArrayList<>();

    @OneToMany(mappedBy = "cliente", targetEntity = Endereco.class, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Endereco> endereco = new ArrayList<>();
}

@Entity
@Component
public class CartaoCredito {

    @Id
    @GeneratedValue( strategy=GenerationType.AUTO )
    private long id_cartao_credito;
    private String numero;
    private String nomeCartao;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_cliente")
    private Cliente cliente;
}

@Entity
@Component
public class Endereco {
    
    @Id
    @GeneratedValue
    private Long id_endereco;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_cliente")
    private Cliente cliente;
}

好的,现在我要跟踪这个错误,看看问题的根源是什么,如果有人对如何处理这个问题有任何想法,我将非常感激,现在非常感谢。

这里有一些错误

1-例外情况是spring无法找到cliente字段/属性,特别是:
findbyclient(cliente-cliente)
意味着您需要在类
entidadeomino
中扩展
JpaRepository
中指定的字段
cliente-cliente

2-此外,由于
JpaRepository
entidadeominio
的,我希望
findbyclient
返回类型应该是
列表


我不确定您的目标是什么,但我认为在EntidaDeDomainio类中,您需要一个字段类型的客户机,然后可以使用FindByclient

class EntidadeDominio  {

private Cliente  cliente  ;

// getter && setter 

}
在您的dao中,FindByclient应该返回一个EntidAdminio
list
列表,而不是客户列表

public interface IJpaRepositoryLivrariaDAO extends 

    JpaRepository<EntidadeDominio, Long> {
        List<EntidadeDominio> findByCliente(Cliente cliente);  
    }
公共接口IJpaRepositoryLivrariaDAO扩展
JpaRepository{
列出FindByclient(客户);
}

您的
IJpaRepositoryLivrariaDAO
正在管理您的
实体的持久性

像这样更新您的存储库

public interface IJpaRepositoryLivrariaDAO extends JpaRepository<EntidadeDominio, Long> {

    List<EntidadeDominio> findByCliente(Cliente cliente); // This will return a list of EntidadeDominio

}
公共接口IJpaRepositoryLivrariaDAO扩展了JpaRepository{
List findbyclient(Cliente Cliente);//这将返回entidadeomino的列表
}
以后你可以这样做

List<EntidadeDominio> entidadeDominios =  repository.findByC...;
List<Cliente> clients = entidadeDominios.getCliente(); //Given that you have Cliente as composition in your EntidadeDominio entity.
List entidadeominos=repository.findByC。。。;
List clients=entidadeominos.getCliente()//假设您的EntityAdminio实体中有客户作为组成部分。

谢谢@Zeromus,我一直认为可以从我的pojo类生成,现在很清楚这是不可能的,我正在使用反射来生成我的通用查询,该方法仍然不完整,需要异常处理。我不知道这是否是这个问题的最佳解决方案,但我把它贴在这里,也许它对某人有帮助

public class ReflectionQueryCreator {

    private String sql = "";
    private String nomeAtributo;
    private Object metodoValor;

    public String queryBuilderCliente(Cliente object, Class<Cliente> classe) {

        Method[] classMethods = classe.getMethods(); 
        Field[] classFields = classe.getDeclaredFields();

        for (Method method : classMethods) {
            try {
                if (method.getName().substring(0, 3).equals("get")) {

                    metodoValor = method.invoke(object);

                    for (Field field : classFields) {
                        nomeAtributo = field.getName();

                        if (method.getName().toLowerCase().endsWith(nomeAtributo.toLowerCase()))

                            if (!(metodoValor.equals("") || metodoValor.equals(0) || method.toString().contains("Id"))) {

                                if (method.getReturnType().getSimpleName().equals("String"))
                                    sql = sql + object.getClass().getSimpleName().toLowerCase() + "." + nomeAtributo + " like %" + metodoValor + "% and ";

                                else if (method.getReturnType().getSimpleName().equals("long") && metodoValor.equals(0))
                                    sql = sql + object.getClass().getSimpleName().toLowerCase() + "." + nomeAtributo + " = " + metodoValor + " and ";

                            } else
                                break;
                    }
                }
            } catch (IllegalAccessException ex) {ex.printStackTrace();}
              catch (IllegalArgumentException ex) {ex.printStackTrace();} 
              catch (InvocationTargetException ex) {ex.printStackTrace();}
        }
        return sql;
    }
公共类ReflectionQueryCreator{
私有字符串sql=“”;
私有字符串nometriabuto;
私人客体转喻;
公共字符串QueryBuilderClient(客户端对象,类classe){
方法[]classMethods=classe.getMethods();
字段[]classFields=classe.getDeclaredFields();
for(方法:classMethods){
试一试{
if(method.getName().substring(0,3).equals(“get”)){
metodoValor=method.invoke(对象);
for(字段:类字段){
nometributo=field.getName();
if(方法.getName().toLowerCase().endsWith(nometricButo.toLowerCase()))
if(!(metodoValor.equals(“”| | metodoValor.equals(0)| | method.toString()包含(“Id”)){
if(方法.getReturnType().getSimpleName().equals(“字符串”))
sql=sql+object.getClass().getSimpleName().toLowerCase()++“+Nometributo+”like%“+metodoValor+%and”;
else if(method.getReturnType().getSimpleName().equals(“long”)和&metodoValor.equals(0))
sql=sql+object.getClass().getSimpleName().toLowerCase()+“+nomeAtributo+”=“+metodoValor+”和“;
}否则
打破
}
}
}catch(IllegalAccessException ex){ex.printStackTrace();}
catch(IllegalArgumentException ex){ex.printStackTrace();}
catch(InvocationTargetException ex){ex.printStackTrace();}
}
返回sql;
}

EntidadeDomainio
添加代码@Zeromous我用
列表测试了
但是仍然遇到同样的问题,但是改变
的假设
代码编译,我想如果我在我的类
EntidadeDomainio
中放一个
类型的atribute,比如@biarrayoub和@AbdullahKhan提到的,我会让它工作,但正如我所说的,这会弄乱我的数据库,关于你的问题,我基本上是想用object而不是Parameters来进行查询,因为我有很多参数来进行我需要的查询。@Wesley Silva好的,你的更新现在正在解释你要做的事情。但是很抱歉,你不能像那样传递一个完整的实体,希望我t为每个对应的实体字段创建所有where语句。。。
public interface IJpaRepositoryLivrariaDAO extends 

    JpaRepository<EntidadeDominio, Long> {
        List<EntidadeDominio> findByCliente(Cliente cliente);  
    }
public interface IJpaRepositoryLivrariaDAO extends JpaRepository<EntidadeDominio, Long> {

    List<EntidadeDominio> findByCliente(Cliente cliente); // This will return a list of EntidadeDominio

}
List<EntidadeDominio> entidadeDominios =  repository.findByC...;
List<Cliente> clients = entidadeDominios.getCliente(); //Given that you have Cliente as composition in your EntidadeDominio entity.
public class ReflectionQueryCreator {

    private String sql = "";
    private String nomeAtributo;
    private Object metodoValor;

    public String queryBuilderCliente(Cliente object, Class<Cliente> classe) {

        Method[] classMethods = classe.getMethods(); 
        Field[] classFields = classe.getDeclaredFields();

        for (Method method : classMethods) {
            try {
                if (method.getName().substring(0, 3).equals("get")) {

                    metodoValor = method.invoke(object);

                    for (Field field : classFields) {
                        nomeAtributo = field.getName();

                        if (method.getName().toLowerCase().endsWith(nomeAtributo.toLowerCase()))

                            if (!(metodoValor.equals("") || metodoValor.equals(0) || method.toString().contains("Id"))) {

                                if (method.getReturnType().getSimpleName().equals("String"))
                                    sql = sql + object.getClass().getSimpleName().toLowerCase() + "." + nomeAtributo + " like %" + metodoValor + "% and ";

                                else if (method.getReturnType().getSimpleName().equals("long") && metodoValor.equals(0))
                                    sql = sql + object.getClass().getSimpleName().toLowerCase() + "." + nomeAtributo + " = " + metodoValor + " and ";

                            } else
                                break;
                    }
                }
            } catch (IllegalAccessException ex) {ex.printStackTrace();}
              catch (IllegalArgumentException ex) {ex.printStackTrace();} 
              catch (InvocationTargetException ex) {ex.printStackTrace();}
        }
        return sql;
    }