como que eu consigo descobrir o nome de um campo com a anotação @Id ??
e mais, se possivel, como descobrir se há uma outra anotação @Column e caso houver descobrir o valor do parametro name, @Column(name="…")[code] public class Material{
@Id @Column(name=“cod_interno”) private Integer id;
@NotNull private String nome;
//… métodos
}
public class Aluno{
@Id private Integer matricula;
@NotNull private String nome;
//... métodos
}
[/code]
queri algo + ou - assim
public String findIdColumnName(Class clazz) {
//... procedimentos para encontrar o nome do id
}
ai eu faria algo como
//... resultado do console abaixo ...
System.out.println(findIdColumnName(Aluno.class));
//cod_interno
System.out.println(findIdColumnName(Matricula.class));
//matricula
…
segue solução
[code] public static String findIdColumnName(Class<?> clazz) {
Field idField = findIdField(clazz);
return (idField == null) ? null : getColumnName(idField);
}
public static Field findIdField(Class<?> clazz) {
Field idField = null;
Field[] fieldList = clazz.getDeclaredFields();
int cursor = 0;
boolean needSearch = (fieldList.length > 0);
while (needSearch) {
Field field = fieldList[cursor++];
if (field.isAnnotationPresent(Id.class))
idField = field;
needSearch = (idField == null && cursor < fieldList.length);
}
return idField;
}
public static String getColumnName(Field field) {
return field.isAnnotationPresent(Column.class) ?
field.getAnnotation(Column.class).name() : field.getName();
}[/code]
public String findIdColumnName(Class clazz) {
List<String> r = new ArrayList<String>();
Field[] fileds = clazz.getDeclaredFields();
for (Field f : fileds) {
for(Annotation annotation : f.getAnnotations())
if(annotation.equals(Id.class))
return f.getName();
}
return "";
}
vlw cara ^^ teu código funfou, aliais, quase… tive q fazer uma modificação…
na linha
if(annotation.equals(Id.class))
troquei por
if(annotation.annotationType().equals(Id.class))
esse já funfou pra achar o nome… no caso de quando tem Column ainda não … vou ver c dou uma mudada aki
meu código por enquanto ta assim
[code]public class Teste {
public class Material{
@Id @Column(name=“cod_interno”) private Integer id;
@NotNull private String nome;
//… métodos
}
public class Aluno{
@Id private Integer matricula;
@NotNull private String nome;
//... métodos
}
public static void main(String[] args) {
//... resultado do console abaixo ...
System.out.println(findIdColumnName(Aluno.class));
//cod_interno
System.out.println(findIdColumnName(Material.class));
//matricula
}
public static String findIdColumnName(Class clazz) {
String fieldName = null;
Field[] fileds = clazz.getDeclaredFields();
for (Field f : fileds) {
for(Annotation annotation : f.getAnnotations())
if(annotation.annotationType().equals(Id.class)) {
fieldName = f.getName();
break;
}
}
return fieldName;
}
}[/code]
Assim eu acho que te atende.
public String findIdColumnName(Class clazz) {
List<String> r = new ArrayList<String>();
Field[] fileds = clazz.getDeclaredFields();
for (Field f : fileds) {
if (f.getAnnotation(Id.class)!=null){
if(f.getAnnotation(Column.class)!=null))
return f.getAnnotation(Column.class).name();
return f.getName();
}
}
return "";
}
é agora funciona… eu fiz um pouco diferente do seu… por conta da norma da sun que fala pra num usar + de 1 return no mesmo método
public static String findIdColumnName(Class clazz) {
String fieldName = null;
Field[] fileds = clazz.getDeclaredFields();
int cursor = 0;
boolean needSearch = (fileds.length > 0);
while (needSearch) {
Field f = fileds[cursor++];
if (f.isAnnotationPresent(Id.class))
if (f.isAnnotationPresent(Column.class))
fieldName = f.getAnnotation(Column.class).name();
else
fieldName = f.getName();
needSearch = (fieldName == null && cursor < fileds.length);
}
return fieldName;
}
[quote=“prbpedro”]for(Annotation annotation : f.getAnnotations())
if(annotation.equals(Id.class))
return f.getName();[/quote]
No lugar desse for, o código abaixo não funciona?
if(f.isAnnotationPresent(Id.class)){