# Junction

Artifact: [androidx.room:room-common](https://developer.android.com/jetpack/androidx/releases/room) [View Source](https://cs.android.com/search?q=file:androidx/room/Junction.kt+class:androidx.room.Junction) Added in [2.2.0](https://developer.android.com/jetpack/androidx/releases/room#2.2.0)

*** ** * ** ***


```
@Target(allowedTargets = )
@Retention(value = AnnotationRetention.BINARY)
public annotation Junction
```

<br />

*** ** * ** ***

Declares a junction to be used for joining a relationship.

If a `https://developer.android.com/reference/androidx/room/Relation` should use an associative table (also know as junction table or join table) then you can use this annotation to reference such table. This is useful for fetching many-to-many relations.

```
@Entity(primaryKeys = {"pId", "sId"})
public class PlaylistSongXRef {
    val pId: Int,
    val sId: Int
}
public class PlaylistWithSongs {
    @Embedded
    val playlist: Playlist
    @Relation(
            parentColumn = "playlistId",
            entity = Song::class,
            entityColumn = "songId",
            associateBy = Junction(
                    value = PlaylistSongXRef::class,
                    parentColumn = "pId",
                    entityColumn = "sId")
    )
    val songs: List<String>
}

@Dao
public interface MusicDao {
    @Query("SELECT * FROM Playlist")
    val getAllPlaylistsWithSongs(): List<PlaylistWithSongs>
}
```

In the above example the many-to-many relationship between a `Song` and a `Playlist` has an associative table defined by the entity `PlaylistSongXRef`.

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/room/Relation` |   |

## Summary

| ### Public methods |
|---|---|
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/java/lang/String.html` | `https://developer.android.com/reference/androidx/room/Junction#getEntityColumn()()` The junction column that will be used to match against the `https://developer.android.com/reference/androidx/room/Relation#entityColumn()`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/java/lang/String.html` | `https://developer.android.com/reference/androidx/room/Junction#getParentColumn()()` The junction column that will be used to match against the `https://developer.android.com/reference/androidx/room/Relation#parentColumn()`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.reflect/-k-class/index.html<@https://developer.android.com/reference/androidx/annotation/NonNull ?>` | `https://developer.android.com/reference/androidx/room/Junction#getValue()()` An entity or database view to be used as a junction table when fetching the relating entities. |

## Public methods

### getEntityColumn

```
public final @NonNull String getEntityColumn()
```

The junction column that will be used to match against the `https://developer.android.com/reference/androidx/room/Relation#entityColumn()`.

If not specified it defaults to `https://developer.android.com/reference/androidx/room/Relation#entityColumn()`.

### getParentColumn

```
public final @NonNull String getParentColumn()
```

The junction column that will be used to match against the `https://developer.android.com/reference/androidx/room/Relation#parentColumn()`.

If not specified it defaults to `https://developer.android.com/reference/androidx/room/Relation#parentColumn()`.

### getValue

```
public final @NonNull KClass<@NonNull ?> getValue()
```

An entity or database view to be used as a junction table when fetching the relating entities.

| Returns |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/NonNull https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.reflect/-k-class/index.html<@https://developer.android.com/reference/androidx/annotation/NonNull ?>` | The entity or database view to be used as a junction table. |