Ich verwende Springboot 3.4.2 (neuestes im Moment) Ich kann erholsame Controller erstellen, die auf den Dienst zugreifen, und dann tätigen wir einen Repository -Anruf, um Daten aus der Datenbank zu erhalten, die alle 100%funktionieren. Ich verstehe vollkommen darin, warum wir in den meisten Fällen das Entität nicht wieder auf das, was die erholsame API bezeichnet, zurückgeben sollten. In einigen Fällen möchten wir einfach nicht, dass Daten zurückgegeben werden, und in anderen Fällen möchten wir einige Daten aggregieren oder Berechnungen zu Daten durchführen. Daher würde ein DTO dafür verwendet. Ich nehme die Entität DTO -Mapping vollständig an. Nach dem, was ich gelesen habe, sind die Datensätze unveränderlich. Ich habe gelesen, dass viel Literatur zu DTO (mit Lombok) ist, ist anders als Aufzeichnungen. Wenn ich jetzt meine Repositorys so halten möchte, wie sie sind, kann ich einfach den Code schreiben, um von Entitäten zu Aufzeichnungen zu kartieren, aber wollen wir das tun? Aus anderen Beispielen im Internet kann ich sehen, dass wir Spring Data JPA zum direkten Laden in Datensätze verwenden können. Wenn die Felder genau gleich sind, ist die Zuordnung recht einfach. Wenn die Daten in einigen Gründen unterschiedlich sind, gibt es auch eine Möglichkeit, dies zu beheben, aber ich bin noch nicht da. Also habe ich eine Frage und es ist ein kleines Problem, aber vielleicht fehlt mir etwas. Lassen Sie mich den Code dort draußen platzieren. < /P>
@Entity
@Table(name = "company")
public class CompanyEntity implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "company_id")
private long companyId;
@Column(name = "active")
private boolean active;
@Column(name = "code")
private String companyCode;
@Column(name = "name")
private String companyName;
@Column(name = "description")
private String description;
@Column(name = "address1")
private String address1;
@Column(name = "address2")
private String address2;
@Column(name = "city")
private String city;
@Column(name = "state")
private String state;
@Column(name = "zip")
private String zip;
}
< /code>
Und jetzt haben wir die Datensatzklasse mit den gleichen genauen Feldern: < /p>
public record CompanyRecord(long companyId, boolean active,
String companyCode,
String companyName, String description, String address1,
String address2, String city, String state, String zip)
implements Serializable {}
< /code>
Und jetzt habe ich den Repository -Code: < /p>
@Repository("CompanyRepository")
public interface CompanyRepository extends JpaRepository
{
// This works great! No issus here!
public CompanyRecord findByCompanyId(long companyId);
// This works great! No issus here!
public List findAll();
// This does NOT work!
// IDE Reported Error:
// The return type is incompatible with ListCrudRepository.findAll()
public List findAll();
// This works great! No issus here!
List findByCompanyCode(String companyCode);
}
< /code>
Ich weiß also nicht, ob dies eher ein JarePository -Problem ist oder wie dies behoben werden soll. Was noch verwirrender ist, ist die JUNIT -Tests. < /P>
@Test
public void testFindById_Entity()
{
// works as expected, no problems
// surprising because the Repo wanted a CompanyRecord, and not an entity
long companyId = 1;
CompanyEntity companyEntity = companyRepository.findById(companyId).orElse(null);
assertNotNull(companyEntity);
}
@Disabled
@Test
public void testFindById_Record()
{
long companyId = 1;
// doesn't work, and gives an IDE error
// Type mismatch: cannot convert from CompanyEntity to CompanyRecord
// I would expect this to work since the interface specifically asks for a Record
CompanyRecord companyRecord = companyRepository.findById(companyId).orElse(null);
assertNotNull(companyRecord);
}
@Test
public void testFindByCode_Entity()
{
String companyCode = "IBM";
// does not work, AS EXPECTED since the interface wants a record
List companyEntityList = companyRepository.findByCompanyCode(companyCode);
assertNotNull(companyEntityList);
}
@Test
public void testFindByCode()
{
String companyCode = "IBM";
// this works as expected, the interface asks for a record
List companyRecordList = companyRepository.findByCompanyCode(companyCode);
assertNotNull(companyRecordList);
}
@Test
public void testFindAll_Entity()
{
// works as expected
List companyEntityList = companyRepository.findAll();
assertNotNull(companyEntityList);
}
< /code>
Ich sehe absolut einige sehr verwirrende Punkte, die versuchen, dies so zu tun. Manchmal funktioniert das, was ich von ihnen erwartet hatte, und manchmal tun sie es nicht. Ich habe das Gefühl, dass "Rekord" nicht ganz bereit für die Hauptsendezeit ist. Oder ich könnte auf die manuelle Möglichkeit zurückkehren, eine Entität für alle meine Repository -Arbeiten zu verwenden, und caate -Datensätze im Service manuell, aber ich kann sehen, wie die Verwendung eines Datensatzes in den Springdaten die Verwendung von Boilerplate -Code speichern würde.
Jeder hat ähnliche Erfahrungen oder könnte in den Frühlingsdaten JPA mehr Licht auf den Java -Datensatz werfen. Die Baeldung -Seite ist großartige Informationen, aber in ihren Beispielen verwenden sie definitiv Kriterien, und ich gehe diese Straße nicht hinunter. Normalerweise verwende ich HQL für meine spezifischen Anfragen und das könnte ich tun.
Aufzeichnen Sie die Klasse mit Findall mit Spring Data JPA ⇐ Java
-
- Similar Topics
- Replies
- Views
- Last post