Comment puis-je utiliser CriteriaBuilder à écrire une jointure externe gauche lorsque la relation va dans l'autre sens?
Je suis en utilisant JPA 2.0, Hibernate 4.1.0.Final et MySQL 5.5.37. J'ai les deux entités ...
@Entity
@Table(name = "msg")
public class Message
{
@Id
@NotNull
@GeneratedValue(generator = "uuid-strategy")
@Column(name = "ID")
private String id;
@Column(name = "MESSAGE", columnDefinition="LONGTEXT")
private String message;
et
@Entity
@Table(name = "msg_read", uniqueConstraints = { @UniqueConstraint(columnNames = { "MESSAGE_ID", "RECIPIENT" }) })
public class MessageReadDate
{
@Id
@NotNull
@GeneratedValue(generator = "uuid-strategy")
@Column(name = "ID")
private String id;
@ManyToOne
@JoinColumn(name = "RECIPIENT", nullable = false, updatable = true)
private User recipient;
@ManyToOne
@JoinColumn(name = "MESSAGE_ID", nullable = false, updatable = true)
private Message message;
@Column(name = "READ_DATE")
private java.util.Date readDate;
À l'aide de CriteriaBuilder, comment pourrais-je écrire ce
SELECT DISTINCT m.*
FROM msg AS m
LEFT JOIN msg_read AS mr
ON mr.message_id = m.id AND mr.recipient = 'USER1'
? Mon problème est que il n'y a pas de champ “msg_read” dans mon Message de l'entité, et je ne suis pas sûr de la façon de spécifier le “ET” de la jointure externe gauche dans CriteriaBuilder.
Ne
Le
mr.recipient = 'USER1'
travail de toute façon?Le
ON
la clause peut être utilisée pour ajouter des conditions supplémentaires à la condition de jointure qui fait partie de la JPA 2.1. Par conséquent, il est uniquement disponible en mode veille prolongée 4.3.x et au-delà, sauf si vous utilisez plaine Hibernate qui prend en charge la with
clause pour la même chose.OriginalL'auteur Dave | 2014-09-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire quelque chose comme cela.
J'espère que cela permettra de résoudre votre requête.
OriginalL'auteur DeepInJava
Si il n'y a pas de relation explicite entre les deux entités (pas d'association bidirectionnelle) puis la condition de JOINTURE est placé dans la clause where.
JPQL approche peut se présenter comme suit:
par conséquent, les Critères de l'API peut se présenter comme suit:
Comment est votre
User
entité définie?N'est-ce pas la solution effectuer une jointure interne? Comment pourrait-on faire la même chose mais jointure externe?
voir ma réponse ci-dessous
OriginalL'auteur wypieprz
vous ne pouvez pas le faire en JPA 2.0 (dans les critères de requêtes). soit vous devez le faire via JPQL, ou la mise à niveau de JPA 2.2. en JPA 2.2 ils ont introduit l' .() l'opérateur qui permet arbitraire des jointures externes.
OriginalL'auteur him